Go 知识点(08) — 对未初始化的 channel 进行读写操作会造成永久阻塞,对其关闭会触发 panic

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 时一定要确保对其已经初始化操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wohu007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值