go runtime_error ai_generated true

缺陷: select 随机选择 case,观察到消息乱序

bug: select picks random case, message reordering observed

ID: go/select-random-case-when-multiple-ready

其他格式: JSON · Markdown 中文 · English
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.

generic

解决方案

  1. 90% 成功率
    select {
    case v := <-highPriority:
        handle(v)
    default:
        select {
        case v := <-highPriority:
            handle(v)
        case v := <-lowPriority:
            handle(v)
        }
    }
  2. 85% 成功率
    type msg struct { prio int; body any }
    // single channel; consumer sorts or dispatches by prio

无效尝试

常见但无效的做法:

  1. 95% 失败

    Go does not honor case order for priority; selection is random.

  2. 90% 失败

    Doesn't affect select semantics and adds latency.