select
select 是一次性的!
select 的作用:
- 多个 channel 同时等待
- 超时控制
- 主动取消
- 协程调度友好
“我同时等这几件事,只要有一件能立刻做,我就做它。”
go
select {
case v := <-ch1:
// ch1 有数据
case ch2 <- x:
// ch2 可以发送
case <-time.After(time.Second):
// 超时
}ch1 接受到值就执行后面的
ch2 是当 x 发送成功,就执行后面的
time.After(time.Second) 是go 的API
elect 只关心“是否会阻塞”
如果所有 case 都会阻塞, 整个 select 阻塞
重复 select
go
for {
select {
case v, ok := <-ch:
if !ok {
fmt.Println("channel 关闭,退出")
return
}
fmt.Println(v)
}
}