channel
channel 用于 goroutine 之间传递数据。
可以理解为:
goroutine 之间通信的管道。
一、创建 channel
发送数据:
接收数据:
二、最小示例
执行流程:
- 创建 channel。
- goroutine 发送
"hello"。 - main goroutine 接收消息。
- 打印结果。
三、无缓冲 channel
无缓冲 channel 发送和接收必须同时准备好。
如果没有接收者,发送会阻塞。
如果没有发送者,接收会阻塞。
四、有缓冲 channel
容量是 2,所以可以先放两个值。
缓冲满了后,继续发送会阻塞。
五、关闭 channel
关闭表示不会再发送新数据。
接收方可以这样判断:
六、range 读取 channel
range ch 会一直读,直到 channel 被关闭。
七、谁负责关闭 channel
通常由发送方关闭 channel。
不要让接收方关闭,因为接收方不知道发送方是否还会继续发送。
常见原则:
八、channel 使用建议
- 用 channel 传递数据,不要共享变量后到处加锁。
- 需要等待一组任务时,
sync.WaitGroup更直接。 - 需要取消任务时,优先使用
context。 - 不要为了并发而强行使用 channel。
Go 的经典理念是:
实际开发中,channel 和锁都会用,关键是选择更清晰的方案。

