先看一個案例
func main() {
c := make(chan bool, 1)
go func() {
fmt.Println("go func()", <-c)
fmt.Println("go func()", <-c)
}()
c <- true
time.Sleep(1 * time.Second)
c <- false
c <- true
fmt.Println("main()")
}
執行結果
go func() true
... (sleep 1 sec) ...
go func() false
main()
就讀出channel而言,有資料就會讀出後立即往下執行,反之,會等待有資料才讀出往下執行。
所以別再以同步或非同步(異步)來理解channel。而是以 阻塞(blocked)來理解才是正確的唷!
另外加以下二個思考題,請大家自行測試,
channel宣告改為以下buffer size = 2 ,執行結果如何?
c := make(chan bool, 2)
channel宣告的buffer size = 0,大家覺得成立嗎,還是會有error呢? c := make(chan bool, 0)
希望以上的解說,能導正對channel的認知