194 字
1 分钟
读写已关闭的Channel
2026-03-12

从一个已关闭的 Channel 仍能读出数据吗?#

如果 Channel 是有缓冲,且返回的 ok 不为 false 时,依然能读出有效值。

func main() {
ch := make(chan int, 5)
ch <- 18
close(ch)
x, ok := <- ch
if ok {
fmt.Println("received: ", x)
}
x, ok := <- ch
if !ok {
fmt.Println("channel closed, data invalid.")
}
}

往一个关闭的Channel写入数据会发生什么?#

往已关闭的 Channel 写入数据会直接 panic。 向已关闭的 Channel 发送数据时,runtime 会检测到 Channel 的 closed 标志位已经设置,立即抛出 “send on closed channel”的 panic。这个检查发生在发送操作的最开始阶段,甚至在获取 mutex 锁之前就会进行判断,所以不会有任何数据写入的尝试,直接就 panic了。

读写已关闭的Channel
https://blog.sleepwf.dev/posts/读写已关闭的channel/
作者
Sleepwf
发布于
2026-03-12
许可协议
CC BY-NC-SA 4.0