channel
在源码中channel
的数据结构大体如下:
1 |
|
创建一个容量为 6 的,元素为 int 型的 channel 数据结构如下 :
必须值得注意的是:
关闭 channel 后,对于等待接收者而言,会收到一个相应类型的零值
优雅关闭channel
, 根据 sender 和 receiver 的个数,分下面几种情况:
- 一个 sender, M 个 receiver, 直接在sender端关闭,用双值语句检查是否关闭
- N 个 sender,一个 reciver,提供一个关闭信号channel,reciver端发送信号(关闭信号channel)
- N 个 sender, M 个 receiver,提供一个中间channel,一个信号channel,reciver端先发信号给中间channel,由中间channel发送信号关闭信号channel,实现return
操作 | nil channel | closed channel | not nil, not closed channel |
---|---|---|---|
close | panic | panic | 正常关闭 |
读 <- ch | 阻塞 | 读到对应类型的零值 | 阻塞或正常读取数据。缓冲型 channel 为空或非缓冲型 channel 没有等待发送者时会阻塞 |
写 ch <- | 阻塞 | panic | 阻塞或正常写入数据。非缓冲型 channel 没有等待接收者或缓冲型 channel buf 满时会被阻塞 |
1 |
|
1 |
|
channel
https://fatwang1.github.io/2024/12/20/2024121901/