向 nil channel 发送和接收数据都将会导致阻塞
Go 语言中如果你对一个 nil channel 进行发送或接收操作,会导致永久阻塞(deadlock)。这通常是因为在定义 channel 后忘记初始化。例如:
var ch chan int // ch 是 nil
ch <- 1 // 会永久阻塞
<-ch // 也会永久阻塞
原因:
在 Go 中,nil channel 并没有实际的底层资源与之关联,因此不能用于通信操作。对它的发送或接收操作会永远等待对方出现,但实际上对方永远不会出现。
正确做法:
在使用 channel 之前,必须使用 make 或 chan 的初始化形式:
ch := make(chan int)
ch <- 1 // 正常工作
val := <-ch // 正常工作
总结:
-
nil channel ≠ 关闭的 channel,也 ≠ 空的 channel。
-
向或从 nil channel 操作:永久阻塞。
-
向或从 关闭的 channel 操作:
- 发送会 panic。
- 接收会立即返回零值并
ok=false。
-
空的 channel(缓冲区为空)可能会阻塞,但取决于是否有协程在读写。
Do not communicate by sharing memory; instead, share memory by communicating.

浙公网安备 33010602011771号