
问题一:第27行执行完,由于ch一直阻塞着,由于29行还未执行,所以应该会立刻发送一个随机数给ch吧?但是我发现第30行是有概率打印出0的,这是为什么呢?
问题二: 如果注释掉29行,改用28行关闭done。那么30行永远打印0。可是select不是随机执行case语句的么?为什么一旦done有输入了,就会执行第二条case呢?
请大神讲解一下chan的原理,坐等,非常感谢!!
第一个问题涉及到了goroutine调度的问题,你没法确定goroutine里面的循环先执行还是你调用的close 先执行,所以会出现随机性问题。第二个问题我解决不了,抱歉。但是,case 不加break,会执行下一句,纯属无稽之谈,自己写个简单的例子就可以测试出来。
#8
更多评论
27行执行结束,29行就有可能立马执行了。case没有加break,会继续执行下一句。所以你for一次就结束了。而且你代码直接放图片,为什么不直接贴代码,也方便别人直接测试。
#1