有时候由这样的需求,要读取一个channel上的消息,查看在此刻通道上是否有消息,如果没有也不用阻塞,程序继续向下执行。

常规的读取方式肯定会导致阻塞,因为不一定有程序正在写通道;

我们可以借助 select 的方式来满足这个需求。

ch1 := make(chan int)
go func(){
	time.Sleep(3*time.Second)
	ch1<-1
}()

select {
default:
	fmt.Println("no")
case <-ch1:
	fmt.Println("yes")
}
no
ch1 := make(chan int)
go func(){
	time.Sleep(3*time.Second)
	ch1<-1
}()

select {
case <-time.After(1 * time.Second):
	fmt.Println("no")
case <-ch1:
	fmt.Println("yes")
}