channel
通道(channel)是 goroutine 之间传递值的类型安全管道,遵循先进先出顺序。发送方与接收方在通道上的操作天然同步,因此 channel 同时承担通信与同步两种职责。
基本操作
通道操作一览:
无缓冲与有缓冲
Tip
选型经验:无缓冲通道强调"交接时刻"的同步语义,适合信号与任务分发;有缓冲通道用于平滑突发流量或解耦生产/消费速率,容量应基于明确的背压策略而非"越大越好"。
关闭与遍历
由发送方负责关闭通道;向已关闭的通道发送数据会 panic:
Warning
关闭规则:只由发送方关闭;多个发送方时不要由单个发送方关闭(应引入额外的"完成"信号通道)。接收方永远不需要关闭通道。
select:多路复用
select 同时等待多个通道操作,就绪者随机选择执行;均未就绪时阻塞,含 default 时立即走默认分支:
select 配合 time.After 是实现操作超时的标准手法,与 context 的超时机制互补。
方向限定
函数签名中可限定通道方向,由编译器防止误用:
并发模式:流水线与 fan-in
小结
- channel 是类型安全的通信管道,无缓冲强调同步交接,有缓冲提供解耦。
- 通道由发送方关闭;
range与v, ok := <-ch感知关闭。 select是多路复用与超时控制的核心;方向限定提升 API 安全性。