对未初始化的 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
。 - 对
nil
的chan
进行读写操作会导致永久阻塞,因为没有任何 goroutine 可以与之通信。 - 这种行为是 Go 语言设计的一部分,用于防止对未初始化的
chan
进行误操作。
- 在 Go 中,未初始化的
总结
- 对未初始化的
chan
进行读取操作会导致永久阻塞,因为没有数据可读。 - 对未初始化的
chan
进行写入操作会导致永久阻塞,因为没有 goroutine 可以读取数据。 - 这种设计确保了程序的健壮性,防止对未初始化的
chan
进行误操作。
网友评论