本文详解go中无缓冲channel如何在生产者与消费者goroutine间实现天然同步,解释为何`produce()`在发送完所有数据前会阻塞,以及`range`循环比无限`for{}`更安全的实践原因。
在Go的并发模型中,无缓冲通道(unbuffered channel)本质上是一个同步原语,而非单纯的数据队列。它要求每次发送(ch
回顾你的原始代码:
var msgs = make(chan int) // 无缓冲通道!
当produce()执行 msgs 立即挂起(block),直到consume()恰好执行到
✅ 发送与接收严格配对、逐个同步;
❌ produce()无法“批量投递”后继续执行后续逻辑(如close(msgs));
❌ 若消费者处理过慢或未启动,生产者将永久阻塞。
你的输出中缺失Consumer: 9及后续日志,正是因为:当produce()在第10次发送(即i == 9)时被阻塞,close(msgs)和done 死锁(deadlock)。
✅ 正确解法:用range安全消费 + 显式关闭
将consume()改为使用range遍历通道,它会自动在通道关闭后退出循环: