
一、golang里面几个chan常见的坑
1、向chan发送数据
向已关闭的chan发送数据会panic
|
|
2、关闭chan
- 关闭nil的chan,会panic
- 对已关闭的chan,再次关闭chan,会panic
|
|
3、读chan数据
- chan关闭之后,关闭前放入的数据,仍然可以读取
- 已关闭的chan仍然可以读取,值为零值,返回值ok为false
如何优雅的关闭channel?
根据 sender 和 receiver 的个数,分下面几种情况:
- 一个 sender,一个 receiver
- 一个 sender, M 个 receiver
- N 个 sender,一个 reciver
- N 个 sender, M 个 receiver
1,2两种情况,仅一个sender,直接从sender端关闭channel即可
第3种情况解决方案就是增加一个传递关闭信号的 channel,receiver 通过信号 channel 下达关闭数据 channel 指令。senders 监听到关闭信号后,停止发送数据
|
|
对于第4种情况,和第 3 种情况不同,这里有 M 个 receiver,如果直接还是采取第 3 种解决方案,由 receiver 直接关闭 stopCh 的话,就会重复关闭一个 channel,导致 panic。因此需要增加一个中间人,M 个 receiver 都向它发送关闭 dataCh 的“请求”,中间人收到第一个请求后,就会直接下达关闭 dataCh 的指令(通过关闭 stopCh,这时就不会发生重复关闭的情况,因为 stopCh 的发送方只有中间人一个)。另外,这里的 N 个 sender 也可以向中间人发送关闭 dataCh 的请求。
|
|
目录
相关文章
golang chan close源码分析
4、chan关闭流程 参考https://www.bookstack.cn/read/qcrao-Go
2021年9月17日
golang chan recv源码分析
2、chan读取源码分析 chan的读取源码入口是如下两个函数: 1 2 3 4 5 6 7 8 9 // 读取的数据放在el
2021年9月17日
golang chan send源码分析
3、chan写入源码分析 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
2021年9月17日
golang chan数据结构
二、chan源码解读 1、chan数据结构 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 type
2021年9月17日
golang内联判断
一、什么是函数内联 内联优化是什么? 内联(inlining)是编程语言编译器常用的优化手段,其优化的对
2023年1月14日
赞赏
微信
