![image.png](https://static.studygolang.com/190704/f138f8320eb7f9fa6062513ee4ad44fa.png)
问题一:第27行执行完,由于ch一直阻塞着,由于29行还未执行,所以应该会立刻发送一个随机数给ch吧?但是我发现第30行是有概率打印出0的,这是为什么呢?
问题二: 如果注释掉29行,改用28行关闭done。那么30行永远打印0。可是select不是随机执行case语句的么?为什么一旦done有输入了,就会执行第二条case呢?
请大神讲解一下chan的原理,坐等,非常感谢!!
没地方读的意思是,假设两个case中执行了第一个case,向chan写了数据,但是因为这个chan是无缓冲区的,必须有地方等待着读这个数据,但是实际情况是主main中,执行的地方在“done<-1”会阻塞在这里。
这里最关键的就是无缓冲区,所以才会导致这个问题,你自己用假设法试一下吧,确实不怎么好理解。
#13
更多评论
27行执行结束,29行就有可能立马执行了。case没有加break,会继续执行下一句。所以你for一次就结束了。而且你代码直接放图片,为什么不直接贴代码,也方便别人直接测试。
#1