当前位置:网站首页>读写关闭的channel是啥后果?
读写关闭的channel是啥后果?
2022-07-04 17:32:00 【小锟哥哥】
在 go 的面试中,最常问到的知识点无疑是 channel 了。
当 channel 关闭后再去读取数据会出现啥情况,最经常被问到。
一、正常的 channel
首先我们先来一段正常操作的代码:
ch := make(chan int, 3)
ch <- 1
ch <- 2
ch <- 3
for item := range ch {
fmt.Println(item)
}
这段代码应该非常熟悉,这样写是否有问题呢?
执行后的结果:
$ go run n.go
1
2
3
fatal error: all goroutines are asleep - deadlock!
如果一个 channel 不在某个协程里面关闭的话,我们的 for range 就会报死锁的错误。
二、关闭后再读取
1、使用 for range 读取关闭后的 channel
现在我们在 for range 之前关闭下这个 channel,看会出现啥情况:
ch := make(chan int, 3)
ch <- 1
ch <- 2
ch <- 3
close(ch)
// 如果不关闭会报死锁 fatal error: all goroutines are asleep - deadlock!
for item := range ch {
fmt.Println(item)
}
这样写代码会出现啥问题呢?
$ go run n.go
1
2
3
啥错也没有,正常的读取。
2、直接独立取值
下面我们换直接独立取值的方式:
ch := make(chan int, 3)
ch <- 1
ch <- 2
ch <- 3
close(ch)
item, state := <-ch // state 为是否读到有值
fmt.Println(item, state)
state 会返回是否取到了值,这段代码的执行结果是取到第一个值:
$ go run n.go
1 true
如果我们反复读取呢?
ch := make(chan int, 3)
ch <- 1
ch <- 2
ch <- 3
close(ch)
<-ch
<-ch
<-ch
item, state := <-ch // state 为是否读到有值
fmt.Println(item, state) //全部读完值之后,再读也不会报错,只会取到零值
我前面读取 3 次,把里面的数据读取完毕后,再读取得到就是零值了。
$ go run n.go
0 false
所以结论是:如果 channel 有元素还未读,会正确读出来,哪怕他已经关闭了。
三、往里面写值呢?
最后一起来看下,当 channel 关闭后,往里面写值会怎样?
ch := make(chan int, 3)
ch <- 1
ch <- 2
ch <- 3
close(ch)
ch <- 4
这段代码执行后的结果:
$ go run n.go
panic: send on closed channel
会报 panic,具体原因我们可以看 go 的源码,路径为:src/runtime/chan.go
边栏推荐
猜你喜欢
一种将Tree-LSTM的强化学习用于连接顺序选择的方法
Deleting nodes in binary search tree
[mathematical modeling of graduate students in Jiangxi Province in 2022] analysis and code implementation of haze removal by nucleation of water vapor supersaturation
Torchdrug tutorial
Angry bird design based on unity
Installation and use of VMware Tools and open VM tools: solve the problems of incomplete screen and unable to transfer files of virtual machines
Nebula Importer 数据导入实践
Li Kou brush question diary /day4/6.26
Journal des problèmes de brosse à boutons de force / day6 / 6.28
Microservice architecture debate between radical technologists vs Project conservatives
随机推荐
6.26CF模拟赛B:数组缩减题解
[209] go language learning ideas
Principle and application of ThreadLocal
Crawler (6) - Web page data parsing (2) | the use of beautifulsoup4 in Crawlers
激进技术派 vs 项目保守派的微服务架构之争
Uni app and uviewui realize the imitation of Xiaomi mall app (with source code)
Using SSH
[211] go handles the detailed documents of Excel library
爬虫(6) - 网页数据解析(2) | BeautifulSoup4在爬虫中的使用
Halcon template matching
物联网应用技术的就业前景和现状
Angry bird design based on unity
Download the first Tencent technology open day course essence!
repeat_P1002 [NOIP2002 普及组] 过河卒_dp
php伪原创api对接方法
Detailed explanation of the maturity classification of ITSS operation and maintenance capability | one article clarifies the ITSS certificate
Learning path PHP -- phpstudy "hosts file does not exist or is blocked from opening" when creating the project
File processing examples of fopen, FREAD, fwrite, fseek
每日一题(2022-07-02)——最低加油次数
How is the entered query SQL statement executed?