select会对每个case进行判断,当其中一个case可以操作时执行该case,当所有的case不能执行时会阻塞,我们根据此特性写出如下代码
package main
import (
"fmt"
"time"
)
func main() {
ch := make(chan int)
s := make(chan int)
go func() {
for {
select {
case num := <-ch:
fmt.Println(num)
case <-time.After(5 * time.Second):
fmt.Println("超时")
s <- 1
}
}
}()
for i := 0; i < 3; i++ {
ch <- i
time.Sleep(time.Second)
}
<-s
fmt.Println("程序结束")
}
只需要在select中加入一个time.After(),在其他case不能执行时,达到一定时间就会执行time.After()后的代码,从而对超时进行处理