go
runtime_error
ai_generated
true
缺陷: select 随机选择 case,观察到消息乱序
bug: select picks random case, message reordering observed
ID: go/select-random-case-when-multiple-ready
80%修复率
85%置信度
0证据数
2024-08-14首次发现
版本兼容性
| 版本 | 状态 | 引入 | 弃用 | 备注 |
|---|---|---|---|---|
| 1.x | active | — | — | — |
根因分析
当多个 select case 同时就绪时,Go 伪随机选择一个。假设确定性顺序或优先级的代码会出错。
English
When multiple select cases are ready, Go picks one pseudo-randomly. Code assuming deterministic ordering or priority breaks.
解决方案
-
90% 成功率
select { case v := <-highPriority: handle(v) default: select { case v := <-highPriority: handle(v) case v := <-lowPriority: handle(v) } } -
85% 成功率
type msg struct { prio int; body any } // single channel; consumer sorts or dispatches by prio
无效尝试
常见但无效的做法:
-
95% 失败
Go does not honor case order for priority; selection is random.
-
90% 失败
Doesn't affect select semantics and adds latency.