golang select 和 chan的疑问
func second\_115() {
i := 0
f := func() int {
i++
return i
}
ch := make(chan int, 1)
// ch <- f()
select {
case ch <- f():
fmt.Println("hello")
default:
fmt.Println(i)
}
}
现在代码输出的是 hello,为什么将注释放开以后执行的是default,输出的是2? 已经懵逼了。。。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
如果不注释的话
ch <- f()
向通道中塞了一个值,通道就满了,select
里面就塞不进去了,所在走的default,你要不把通道里面的值消耗掉,要么把通道容量设置大一点。<-ch
取出一个值,现在通道又空了;ch := make(chan int, 1)
这条语句里面1改为2如果不注释,代码必然会执行 ch <- f(),此时i的值变为1 .当执行到select 的时候,会继续执行ch <- f()。 由于(chan int ,1)他的dataqsiz=1.最大是1个数值。自然会被阻塞,不会执行完毕ch<-f().但是此时f()已经执行完毕。i 也变为2.所以最后输出的是i=2