golang中chan 无缓冲和 chan有缓冲 长度size设为1的区别

在群里看到有人说没有区别。其实差别还很大的呀
 
无缓冲情况下,一把数据放入chan,如果没有其他协程取数据,接下来的操作是阻塞的
而在size=1的情况下, 第一个数据放入chan后,并不会马上阻塞,接下来的操作还是可以进行的。
 
看下面的代码 f1和f2的区别
 
package main

import "time"

func f1() {

ch := make(chan int) // no buffer
go func() {

ch <- 0
println("out of routine")
}()
println("f1 start")
time.Sleep(time.Second * 3)
<-ch
println("End")

}

func f2() {

ch := make(chan int, 1) // size =1
go func() {

ch <- 0
println("out of routine")
}()
println("f1 start")
time.Sleep(time.Second * 3)
<-ch
println("End")

}
func main() {
//f1()
f2()
}

f1 最后不会输出End, 而f2则可以输出f2
 
创建了一个免费的Go知识星球社区,欢迎加入一起讨论吧

 

0 个评论

要回复文章请先登录注册