go runtime_error ai_generated true

致命错误:所有协程都处于睡眠状态 - 死锁!(在nil通道上select)

fatal error: all goroutines are asleep - deadlock! (select on nil channels)

ID: go/goroutine-select-on-nil-channels

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

版本兼容性

版本状态引入弃用备注
1.0 active
1.22 active

根因分析

所有通道都为nil的select语句永远阻塞,因为nil通道永远不会就绪。

English

A select statement with all nil channels blocks forever, as nil channels never become ready.

generic

解决方案

  1. 95% 成功率 Always include a default case or non-nil channel in select
    select {
    case <-ch1:
    case <-ch2:
    default:
        // avoid deadlock
    }
  2. 90% 成功率 Ensure at least one channel is non-nil before select
    if ch1 == nil && ch2 == nil {
        return // or handle
    }
    select {
    case <-ch1:
    case <-ch2:
    }

无效尝试

常见但无效的做法:

  1. Adding a default case that does nothing 70% 失败

    Default case executes immediately, but if omitted, all-nil select blocks.

  2. Using time.After in select 40% 失败

    time.After returns a non-nil channel, so select won't have all nil channels.