两个协程用channel来传递数据时,就比如生产者消费者模型,这个channel关闭或者说协程什么时候推出循环

786789256 · · 950 次点击
lizzz49
a foolish coder
if 后面少了个 !
#3
更多评论
`if err == false { break loop }` 这句貌似永远不会执行。 1. 我不知道还有没有其他case语句了,如果没有的话,也就是说只有那一个case的时,当该case无法从`addChan`读取到数据时,整个 `select` 是阻塞的。`err`是没有被赋值的。 2. 当 `B` 能读取到值时,`err` 肯定是 `true` 了。 3. 一般是在产生数据的地方关闭channel。
#1
lizzz49
a foolish coder
1. 一般是在生产的地方关闭chanel; 2. 在消费的地方判断从Chanel中取出的数据是不是空值或者判断chan是否关闭,如果是空值或关闭跳出循环(PS:如果是允许写入Chanel的数据是空值,或者无法确定写入数据是否有空值的,最牢靠的方式还是判断chan是否关闭) ``` loop: for { select { case bb, isClosed := <-addChan: if isClosed { break loop } addSlice = append(addSlice, bb) } } ``` 可以看一下同步chan和缓冲chan的相关知识
#2