全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 模拟技术 >

当channel关闭后再去读取数据会出现啥情况

时间:2022-08-17 11:14

人气:

作者:admin

标签: go语言  Channel 

导读:如果一个 channel 不在某个协程里面关闭的话,我们的 for range 就会报死锁的错误。...

一、正常的 channel

首先我们先来一段正常操作的代码:

poYBAGL8W_2AcShBAAAtCLEMIdc627.png

这段代码应该非常熟悉,这样写是否有问题呢?

执行后的结果:

poYBAGL8XA-ALuPyAAAfzJjckaI325.png

如果一个 channel 不在某个协程里面关闭的话,我们的 for range 就会报死锁的错误。

二、关闭后再读取

1、使用 for range 读取关闭后的 channel

现在我们在 for range 之前关闭下这个 channel,看会出现啥情况:

pYYBAGL8XCGAa_6gAABCUPjPvWw471.png

这样写代码会出现啥问题呢?

poYBAGL8XDWAC2AOAAATcC2lvLk581.png

啥错也没有,正常的读取。

2、直接独立取值

下面我们换直接独立取值的方式:

poYBAGL8XEiAFnr1AAAzJ2ZPpFc917.png

state 会返回是否取到了值,这段代码的执行结果是取到第一个值:

pYYBAGL8XFiAfedsAAANM8qHq90050.png

如果我们反复读取呢?

pYYBAGL8XGmAKOJoAABOiTHv13M638.png

我前面读取 3 次,把里面的数据读取完毕后,再读取得到就是零值了。

pYYBAGL8XICAPSEgAAAO5wQ1CgQ342.png

所以结论是:如果 channel 有元素还未读,会正确读出来,哪怕他已经关闭了。

三、往里面写值呢?

最后一起来看下,当 channel 关闭后,往里面写值会怎样?

pYYBAGL8XJiAIHCgAAAgpEO8GC8725.png

这段代码执行后的结果:

pYYBAGL8XKqAZzgXAAAXHxdNrwY953.png

会报 panic,具体原因我们可以看 go 的源码,路径为:src/runtime/chan.go

poYBAGL8XMSAP3QKAACmUgJdS7I575.png

你学废了么?



审核编辑:刘清

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信