1. 对未初始化的 channel 进行写操作
先看下面代码
func main() {
var ch chan int // 只声明,并没有初始化
fmt.Printf("ch is %v\n", ch) // ch is <nil>
ch <- 1
}
运行上述代码,会有如下输出结果:
ch is <nil>
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan send (nil chan)]:
main.main()
/home/wohu/project/go/src/demo/demo.go:8 +0xa5
exit status 2
从打印结果我们可以看到,当仅仅声明一个 channel
但是并没有初始化时,对该通道进行写操作会一直阻塞 。
2. 对未初始化的 channel 进行读操作
先看下面代码
func main() {
var ch chan int // 只声明,并没有初始化
fmt.Printf("ch is %v\n", ch) // ch is <nil>
r := <-ch
fmt.Printf("r is %v\n", r)
}
运行上述代码,会有如下输出结果:
ch is <nil>
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan receive (nil chan)]:
main.main()
/home/wohu/project/go/src/demo/demo.go:8 +0xb9
exit status 2
同样结果会阻塞,此时报错信息是 chan receive (nil chan)
。
所以对于未初始化的通道进行读写操作时都会造成阻塞。
3. 对未初始化的 channel 进行关闭操作
那么对未初始化的 channel
进行关闭操作,会出现什么情况,看下面代码
func main() {
var ch chan int // 只声明,并没有初始化
fmt.Printf("ch is %v\n", ch) // ch is <nil>
close(ch)
}
输出结果为:
ch is <nil>
panic: close of nil channel
goroutine 1 [running]:
main.main()
/home/wohu/project/go/src/demo/demo.go:10 +0x99
exit status 2
可以看到会有 panic
发生,所以在使用 channel
时一定要确保对其已经初始化操作。