【Go - 每日一小问: 对未初始化的的 chan 进行读写,会怎么样?为什么?】

对未初始化的 chan 进行读写会有不同的行为:

1. 对未初始化的 chan 进行读取

  • 读取操作
    • 对未初始化的 chan 进行读取操作会导致永久阻塞(deadlock),因为没有任何 goroutine 可以向这个 chan 发送数据。
    • 读取操作会一直等待,直到有数据可读,但由于 chan 未初始化,这种情况永远不会发生。

2. 对未初始化的 chan 进行写入

  • 写入操作
    • 对未初始化的 chan 进行写入操作也会导致永久阻塞(deadlock),因为没有任何 goroutine 可以从这个 chan 读取数据。
    • 写入操作会一直等待,直到有 goroutine 读取数据,但由于 chan 未初始化,这种情况永远不会发生。

示例

package main

func main() {
	var ch chan int // 未初始化的 chan

	// 读取未初始化的 chan,会导致永久阻塞
	go func() {
		val := <-ch
		println(val)
	}()

	// 写入未初始化的 chan,也会导致永久阻塞
	ch <- 1
}

为什么会这样?

  • 未初始化的 chan
    • 在 Go 中,未初始化的 chan 的零值是 nil
    • nilchan 进行读写操作会导致永久阻塞,因为没有任何 goroutine 可以与之通信。
    • 这种行为是 Go 语言设计的一部分,用于防止对未初始化的 chan 进行误操作。

总结

  • 对未初始化的 chan 进行读取操作会导致永久阻塞,因为没有数据可读。
  • 对未初始化的 chan 进行写入操作会导致永久阻塞,因为没有 goroutine 可以读取数据。
  • 这种设计确保了程序的健壮性,防止对未初始化的 chan 进行误操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值