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
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.
解决方案
-
95% 成功率 Always include a default case or non-nil channel in select
select { case <-ch1: case <-ch2: default: // avoid deadlock } -
90% 成功率 Ensure at least one channel is non-nil before select
if ch1 == nil && ch2 == nil { return // or handle } select { case <-ch1: case <-ch2: }
无效尝试
常见但无效的做法:
-
Adding a default case that does nothing
70% 失败
Default case executes immediately, but if omitted, all-nil select blocks.
-
Using time.After in select
40% 失败
time.After returns a non-nil channel, so select won't have all nil channels.