Go select

select 用于在多个 channel 操作之间进行等待和分支选择,是 Go 并发控制里处理超时、取消和多路通信的关键语法。

#type / concept #status / growing #tech / dev #resource / go

[!info] related notes

Go select

一句话定义

select 是 Go 用来在多个 channel 通信操作之间等待并做分支选择的并发控制语法。

核心机制 / 工作原理

当一个 goroutine 同时关心多个通信事件时,select 可以:

  • 等待多个发送/接收操作中的一个就绪
  • 在超时、取消和结果返回之间做选择
  • 让并发控制流保持扁平,而不是堆很多嵌套判断

它最常出现的场景包括:

  • ctx.Done() 取消监听
  • time.After(...) 超时控制
  • 多个 worker 或结果通道汇聚

最小例子 / 最小场景

select {
case value := <-resultCh:
    fmt.Println(value)
case <-ctx.Done():
    return ctx.Err()
}

这里真正重要的是:

  • 你不是在等“某个函数返回”
  • 你是在等“多个并发事件里哪一个先发生”

边界与易混淆点

  • select 不是循环,本身只做一次选择;要持续监听通常要和 for 结合
  • default 分支会让 select 变成非阻塞行为
  • select 处理的是 channel 事件,不是任意表达式条件
创建于 2026/6/20 更新于 2026/6/20