go
data_error
ai_generated
true
error: 从已关闭 channel 无限读取零值
error: infinite loop reading zero values from closed channel
ID: go/receive-from-closed-channel-loop
80%修复率
86%置信度
0证据数
2024-06-08首次发现
版本兼容性
| 版本 | 状态 | 引入 | 弃用 | 备注 |
|---|---|---|---|---|
| 1.x | active | — | — | — |
根因分析
期望 for v := range ch 终止,但写成 for { v := <-ch } 的循环在 channel 关闭后会永远返回零值,因为从已关闭 channel 接收永不阻塞。
English
A for v := range ch loop is expected to terminate, but a for { v := <-ch } loop keeps returning zero values forever after close because receives from a closed channel never block.
解决方案
-
97% 成功率
for { v, ok := <-ch if !ok { return } process(v) } -
98% 成功率
for v := range ch { process(v) }
无效尝试
常见但无效的做法:
-
85% 失败
Does not stop the loop; still processes infinite zero values and corrupts data.
-
75% 失败
Zero is a legitimate value; breaks on real data and still races with close.