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

描述

一、正常的 channel

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

go语言

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

执行后的结果:

go语言

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

二、关闭后再读取

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

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

go语言

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

go语言

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

2、直接独立取值

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

go语言

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

go语言

如果我们反复读取呢?

go语言

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

go语言

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

三、往里面写值呢?

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

go语言

这段代码执行后的结果:

go语言

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

go语言

你学废了么?



审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分