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

786789256 · 2018-06-12 08:21:49 · 1056 次点击

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
lizzz49
a foolish coder

if 后面少了个 !

#3