func doWork() <-chan string {
ch := make(chan string)
go func() {
time.Sleep(2 * time.Second) // 子协程睡2秒
ch <- "任务完成"
}()
return ch
}
func main() {
workCh := doWork()
select {
case res := <-workCh:
fmt.Println(res)
case <-time.After(1 * time.Second):
fmt.Println("超时了!")
}
fmt.Println("select结束,main继续往下")
}
// 输出
// 超时了!
// select结束,main继续往下
select 的作用:同时监听多个 channel,谁先 ready,就执行对应的那个 case,然后整个 select 语句直接结束。
两个 case 都在等待:
workCh:还要等 2 秒才有数据
time.After 的通道:只要等 1 秒就就绪
1 秒到达:time.After 的通道收到信号,case2 触发!执行 fmt.Println("超时了!"),select 语句直接结束!