go data_error ai_generated true

error: infinite loop reading zero values from closed channel

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

Also available as: JSON · Markdown · 中文
80%Fix Rate
86%Confidence
0Evidence
2024-06-08First Seen

Version Compatibility

VersionStatusIntroducedDeprecatedNotes
1.x active — — —

Root Cause

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

中文

期望 for v := range ch 终止,但写成 for { v := <-ch } 的循环在 channel 关闭后会永远返回零值,因为从已关闭 channel 接收永不阻塞。

Workarounds

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

Dead Ends

Common approaches that don't work:

  1. 85% fail

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

  2. 75% fail

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