标准答案
- 无缓冲 channel 可建立同步关系,发送方会等待接收方准备好。
- 有缓冲 channel 可以吸收有限突发,但容量耗尽后发送仍会阻塞。
- 关闭 channel 后不能再发送;接收可以继续读取缓冲内容,最终得到零值和 false。
- 不要让多个不明确的发送者随意关闭同一 channel,任务取消应优先使用 context。
题目解析
无缓冲 channel 建立发送和接收的同步交接,有缓冲 channel 只提供有限排队。缓冲满后发送仍会阻塞,容量不能代替背压和持久化。
通常由明确的最后一个发送方关闭 channel;关闭后不能发送,接收方可以读完缓冲并通过 ok/range 感知结束。多个发送者需要协调关闭,否则容易 panic。
关闭表示不会再有新值,不等于强制取消所有下游任务。取消用 context,跨进程可靠任务使用持久化队列,channel 中的数据在进程崩溃时可能丢失。
常见误区
- 误区:接收方关闭仍有其他发送者的 channel。改正:由发送方协调关闭,接收方用 context 或完成信号表达停止。
- 误区:把关闭当作强制取消所有工作。改正:关闭只表达发送结束,任务取消和资源释放由 context/状态协议负责。
- 误区:用无限增长的缓冲模拟队列。改正:设置容量和满载策略,重要任务转入可靠存储。