无缓冲 channel(make(chan T))的发送和接收是同步的:发送方必须等到接收方就绪才能继续,反之亦然,形成 rendezvous 语义,并自带 happens-before 同步保证。有缓冲 channel(make(chan T, n))在缓冲未满时发送立即返回,满了才阻塞;接收方在缓冲非空时不阻塞。

场景选择:无缓冲适合需要强同步、确认对方已收到的场合,如任务交接、信号通知;有缓冲适合解耦生产者消费者速度、削峰填谷、批量聚合,容量本身就是一种背压设计。注意有缓冲 channel '发送成功'不代表对方已处理,语义更弱。

jobs := make(chan Job, 100) // 削峰:生产者最多领先 100 个
done := make(chan struct{}) // 信号用无缓冲,确保送达

易错点:容量不能掩盖消费能力不足,缓冲填满照样阻塞;只发不收必然造成 goroutine 泄漏。追问方向:channel 的 hchan 底层结构(环形队列 + 收发等待队列)、close 的语义。