直接回答:无缓冲 channel 提供同步语义:发送必须等到接收,天然形成握手和 happens-before,适合精确的一次性信号与接力。带缓冲 channel 是队列语义:缓冲满才阻塞,适合削峰、限速(容量即并发度)、批量聚合。经典模式包括:done channel 广播退出信号、worker pool(任务 channel + 固定 worker 数)、semaphore(chan struct{} 容量 N 限流)、fan-out/fan-in 聚合、pipeline 串联处理阶段、select 加超时(time.After)。

展开解析:选型直觉:你想要"对方确认收到"的保证就用无缓冲;想要解耦速度差异就用缓冲,但别把缓冲当可靠性——进程崩溃缓冲里的数据照样丢。几个易错点:向已关闭 channel 发送会 panic,原则是发送方负责关闭、接收方用 v, ok := <-ch 或 range 感知关闭;nil channel 收发永久阻塞,这特性反而可用于动态禁用 select 分支;time.After 在循环里每次新建 timer,高频场景换 time.NewTimer 复用。还要警惕用 channel 传递大结构体的拷贝开销,传指针或索引更常见。channel 不是银弹:共享数据加锁往往比硬套 channel 更清晰。

追问方向:为什么关闭 channel 应该由发送方做?select 的随机语义在何时有用?如何用 channel 实现带超时的请求?

(约 440 字)