go-Channel并发模式-超时控制

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 语句直接结束!