golang中chan 无缓冲和 chan有缓冲 长度size设为1的区别
在群里看到有人说没有区别。其实差别还很大的呀
无缓冲情况下,一把数据放入chan,如果没有其他协程取数据,接下来的操作是阻塞的
而在size=1的情况下, 第一个数据放入chan后,并不会马上阻塞,接下来的操作还是可以进行的。
看下面的代码 f1和f2的区别
f1 最后不会输出End, 而f2则可以输出f2
创建了一个免费的Go知识星球社区,欢迎加入一起讨论吧
无缓冲情况下,一把数据放入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知识星球社区,欢迎加入一起讨论吧