通过示例理解 Golang 中的 Select
Go 中的 select
只做一件事:同时等待多个通道,并对第一个可用的通道采取行动。
换句话说,select 是一个特定于通道的 switch-case 语句。
1. 最小语法
select {
case v := <-ch1: // 从 ch1 获取
fmt.Println("got", v, "from ch1")
case ch2 <- 42: // 发送到 ch2
fmt.Println("sent 42 to ch2")
default: // 如果所有 case 都未就绪,则立即运行 => 非阻塞
fmt.Println("no channel ready")
}
2. 它有什么用途?
-
多路复用 I/O:将多个事件源组合成一个 goroutine。
-
超时/取消:组合 time.After。
-
非阻塞发送/接收:使用默认值。
-
公平性(随机化):如果多个用例就绪,Go 会随机选择(不按顺序)。