select
分支选择
概念
select: 在多个 channel 操作中选择一个可执行分支;case: 必须是 channel 发送或接收操作;- 多个就绪: 随机选择一个执行;
- 全部未就绪: 阻塞等待;
语法格式
func main() {
a := make(chan int, 1)
b := make(chan int, 1)
a <- 1
select {
case v := <-a:
println("a", v) // a 已就绪
case v := <-b:
println("b", v)
}
}
default
概念
default: 没有case就绪时立即执行;- 非阻塞选择: 带
default的select不等待 channel 就绪;
语法格式
func main() {
ch := make(chan int)
select {
case v := <-ch:
println(v)
default:
println("no value")
}
}
超时分支
select {
case v := <-ch:
println(v)
case <-time.After(time.Second): // 指定时间后超时
println("timeout")
}