写在前面
这是一个面试极易被问到的问题,也是很容易出错的点
从未初始化的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, 可以读(读到零值,也可以通过第二个返回值判断是否关闭)、不能写、不能再关闭。