go runtime_error ai_generated true

致命错误:所有 goroutine 都处于休眠状态 - 死锁!(在通道上范围遍历)

fatal error: all goroutines are asleep - deadlock! (range over channel)

ID: go/channel-range-without-close

其他格式: JSON · Markdown 中文 · English
80%修复率
84%置信度
0证据数
2024-03-30首次发现

版本兼容性

版本状态引入弃用备注
1.19 active

根因分析

在从未关闭且没有更多值的通道上进行范围遍历会永久阻塞。

English

Ranging over a channel that is never closed and has no more values blocks forever.

generic

解决方案

  1. 95% 成功率
    ch := make(chan int)
    go func() { defer close(ch); for i:=0;i<5;i++ { ch<-i } }()
    for v := range ch {
        fmt.Println(v)
    }
  2. 90% 成功率
    for {
        select {
        case v, ok := <-ch:
            if !ok { return }
            fmt.Println(v)
        case <-time.After(time.Second):
            return
        }
    }

无效尝试

常见但无效的做法:

  1. 70% 失败

    Break only exits if condition met; if no values, still blocks.

  2. 90% 失败

    Range doesn't support timeout; need select.

  3. 60% 失败

    If the channel is never sent to, still blocks.