golang select 和 chan的疑问

发布于 2022-09-12 00:40:44 字数 338 浏览 23 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

夏末 2022-09-19 00:40:44

如果不注释的话ch <- f()向通道中塞了一个值,通道就满了,select里面就塞不进去了,所在走的default,你要不把通道里面的值消耗掉,要么把通道容量设置大一点。

  1. 消耗值,在 ch<-f() 后面加上<-ch取出一个值,现在通道又空了;
  2. ch := make(chan int, 1)这条语句里面1改为2
木格 2022-09-19 00:40:44

如果不注释,代码必然会执行 ch <- f(),此时i的值变为1 .当执行到select 的时候,会继续执行ch <- f()。 由于(chan int ,1)他的dataqsiz=1.最大是1个数值。自然会被阻塞,不会执行完毕ch<-f().但是此时f()已经执行完毕。i 也变为2.所以最后输出的是i=2

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文