這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
無聞並發的課程看了下,然後給他搞暈了,冊那,我是鉑金便便啊,脾氣是很屎的,你不解釋清楚麼,我就自己去搞清楚。
無聞說緩衝channel不會阻塞,非緩衝channel會阻塞,真的是這樣嗎?
無聞本人舉了個例子
func main(){ c:=make(chan bool,1) go fun(){ fmt.println("GO!") <-c }() c<-true}
上面的代碼只要把1去掉就會輸出GO!不去掉就不會輸出GO!他說這就證明緩衝channel不會阻塞,非緩衝channel會阻塞。那好吧,便便不信邪,我來一段代碼
// testgo project main.gopackage mainimport ( "fmt" "time")func main() { c:=make(chan bool,1) go func(){ fmt.Println("GO!") <-c fmt.Println("123!") }() time.Sleep(1*time.Second) fmt.Println("111") c<-true time.Sleep(1*time.Second) fmt.Println("222") time.Sleep(2*time.Second)}
大家猜猜,輸出是咩?
GO!
111
123!
222
成功: 進程結束代碼 0.
進程goroutines在main進程建立好管道c的時候與main進程同時運行,main先sleep了1秒,首先輸出goroutines的GO!,然後從c中取對象,注意喲,是一個緩衝管道喲,按照無聞的說法應該不會阻塞喲,應該直接輸出123的喲,結果捏?馬桶堵住了!!!阻塞了!!!管道裡面沒有對象,取不出來,一直在等其他進程往管道裡面塞對象,所以說只要有管道,就是會阻塞的。我的例子裡面首先輸出的是111,等main進程把對象塞到管道裡面的時候,goroutines進程就不阻塞了,輸出123.
結論就是 緩衝channel 取不到會阻塞
最後給大家一個自己長期工作以來的忠告,不要盲目相信權威,不知道就去試一下,老師說的不一定對,還有就是自己如果真要上傳視頻教程,請先審核下,不然誤人子弟啊