go data_error ai_generated true

error: 从已关闭 channel 无限读取零值

error: infinite loop reading zero values from closed channel

ID: go/receive-from-closed-channel-loop

其他格式: JSON · Markdown 中文 · English
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.

generic

解决方案

  1. 97% 成功率
    for {
        v, ok := <-ch
        if !ok {
            return
        }
        process(v)
    }
  2. 98% 成功率
    for v := range ch {
        process(v)
    }

无效尝试

常见但无效的做法:

  1. 85% 失败

    Does not stop the loop; still processes infinite zero values and corrupts data.

  2. 75% 失败

    Zero is a legitimate value; breaks on real data and still races with close.