Go select
select 用于在多个 channel 操作之间进行等待和分支选择,是 Go 并发控制里处理超时、取消和多路通信的关键语法。
#type / concept
#status / growing
#tech / dev
#resource / go
[!info] related notes
- 所属 MOC: Go 并发 MOC
- 前置概念: Go channel, Go context
- 关系笔记: goroutine、channel、context 与取消传播的关系
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 事件,不是任意表达式条件