弄了一个类似生产者消费者模型,两个协程有一个通道A,不停写入数据,B不停读取数据,因为都是for循环的,是在A里面没有数据的时候关闭Chanel、,还是在B中判断没有数据,超时就退出for循环呢? loop: for{ select { case bb,err := <-addChan: if err == false { break loop } addSlice = append(addSlice,bb) } } 代码类似这样的,但现在出现了协程死锁了,貌似是这里一直在<-addChan读取数据导致的等待超时,死锁了,但有对err判断啊,这里难道不会退出for循环么?谢谢了
有疑问加站长微信联系(非本文作者)

if err == false { break loop }
这句貌似永远不会执行。addChan
读取到数据时,整个select
是阻塞的。err
是没有被赋值的。B
能读取到值时,err
肯定是true
了。可以看一下同步chan和缓冲chan的相关知识
if 后面少了个 !
生产消费模型的生产者和消费者,可以不用退出循环 非要设计一个开关,也可以 select { case <-close: goto l } l: return