朋友問了一道使用通道來實現“多線程”通訊的golang題,我看了下,還比較簡單。
但由於這個對理解golang之間利用通道通訊有一定的幫助,所以寫下如下代碼,發出來給大家看看。
思路簡要:
最開始需要用一個帶緩存的通道來觸發開始操作,否則會引起死鎖。然後用兩個通道不斷的交替進行接收與發送
package main
/**
用三個線程,交替輸出abc,abc,abc...
*/
import (
"fmt"
"time"
)
func printc(c1 chan bool, c2 chan bool, s string) {
// 這個判斷不能少,否則會亂套,只有在當前接收有效時,才向下一個通道發送數據
if ok := <-c1; ok {
fmt.Println(s)
c2 <- true
}
}
func main() {
// c1 使用帶緩存的通道
c1 := make(chan bool, 1)
c2 := make(chan bool)
c3 := make(chan bool)
defer func() {
close(c1)
close(c2)
close(c3)
}()
// 開始觸發通道 c1
c1 <- true
// 爲了表示,這裏先使用死循環,如果需要正常退出,可以單獨退出處理
for {
go printc(c1, c2, "a")
go printc(c2, c3, "b")
go printc(c3, c1, "c")
time.Sleep(time.Second)
}
}
在通道的接收發送中,我們需要理解一點通道的底層實現原理,那就是接收操作
一定會在發送操作完成
前完成,所以不要擔心不會打印。通用一點,就是第K個接收操作一定會在第K+C個發送操作完成
之前完成。C是通道緩衝大小。