Go channel
channel 是 Go 中用于 goroutine 之间传递数据和同步时序的核心机制,它把通信提升成一等语言结构。
#type / concept
#status / growing
#tech / dev
#resource / go
[!info] related notes
- 所属 MOC: Go 并发 MOC
- 前置概念: Go goroutine
- 并列概念: Go context
- 关系笔记: goroutine、channel、context 与取消传播的关系
Go channel
一句话定义
channel 是 Go 提供的并发通信机制,用来在 goroutine 之间安全地传递值,并在必要时形成同步点。
核心机制 / 工作原理
channel 最核心的两件事:
- 传数据
- 协调时序
基本操作包括:
make(chan T)创建通道ch <- value发送value := <-ch接收close(ch)关闭
无缓冲 channel 常常意味着:
- 发送方和接收方需要在时序上配对
有缓冲 channel 则允许:
- 在容量范围内先写后读
最小例子 / 最小场景
ch := make(chan int)
go func() {
ch <- 42
}()
value := <-ch
fmt.Println(value)
这个例子里 channel 同时承担了:
- 值传递
- goroutine 之间的同步
为什么 channel 是 Go 的主线
Go 鼓励“通过通信共享内存”,至少在很多基础并发场景里,这是更易读的主线。它不意味着锁没用,而是强调先把任务和数据流画清楚。
边界与易混淆点
- channel 不是消息队列系统的完整替代,它是进程内并发原语
- 关闭 channel 是发送方语义,不是接收方语义
- 读已关闭 channel 和向已关闭 channel 发送,行为完全不同