从一个未初始化的chan和一个已关闭的chan中读取数据会发生什么


写在前面

这是一个面试极易被问到的问题,也是很容易出错的点

从未初始化的chan中读取数据会发生什么

var m chan int

i := <-m
fmt.Println(i)

结果

fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive]:

注意,这里报的是死锁问题,而不是说m是空指针

关闭一个未初始化的chan会发生什么

var m chan int
close(m)

i := <-m
fmt.Println(i)

结果

panic: close of nil channel

goroutine 1 [running]:

说明不能关闭一个空指针,会报空指针错误

从一个一句关闭的chan读取数据会发生什么

m := make(chan int)
close(m)

i := <-m
fmt.Println(i)

结果

0

可以从一个已经关闭的chan中读取数据,不会阻塞,会返回零值

向一个未初始化的chane写数据会发生什么

var m chan int
m <- 1

结果

fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan send (nil chan)]:

发生了死锁,不能向未初始化的chan写数据

总结

  • 对于一个未初始化的chan,不能读、不能写、不能关闭,所以chan一定要记得初始化,否则不能做任何操作,因为这个时候它是一个空指针
  • 从一个未初始化的chan中读取或者发送数据,会死锁。但是select case语句不会被阻塞,会执行其他caes
    对于一个已经关闭的chan, 可以读(读到零值,也可以通过第二个返回值判断是否关闭)、不能写、不能再关闭。

文章作者: Alex
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Alex !
  目录