无闻并发的课程看了下,然后给他搞晕了,册那,我是铂金便便啊,脾气是很屎的,你不解释清楚么,我就自己去搞清楚。
无闻说缓冲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.go package main import ( "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 取不到会阻塞
最后给大家一个自己长期工作以来的忠告,不要盲目相信权威,不知道就去试一下,老师说的不一定对,还有就是自己如果真要上传视频教程,请先审核下,不然误人子弟啊
有疑问加站长微信联系(非本文作者)