向 nil channel 发送和接收数据都将会导致阻塞


Go 语言中如果你对一个 nil channel 进行发送或接收操作,会导致永久阻塞(deadlock)。这通常是因为在定义 channel 后忘记初始化。例如:

var ch chan int // ch 是 nil
ch <- 1         // 会永久阻塞
<-ch            // 也会永久阻塞

原因:

在 Go 中,nil channel 并没有实际的底层资源与之关联,因此不能用于通信操作。对它的发送或接收操作会永远等待对方出现,但实际上对方永远不会出现。


正确做法:

在使用 channel 之前,必须使用 makechan 的初始化形式:

ch := make(chan int)
ch <- 1        // 正常工作
val := <-ch    // 正常工作

总结:

  • nil channel ≠ 关闭的 channel,也 ≠ 空的 channel。

  • 向或从 nil channel 操作:永久阻塞

  • 向或从 关闭的 channel 操作:

    • 发送会 panic。
    • 接收会立即返回零值并 ok=false
  • 空的 channel(缓冲区为空)可能会阻塞,但取决于是否有协程在读写。

posted @ 2025-05-13 16:37  guanyubo  阅读(31)  评论(0)    收藏  举报