select
1> select可以实现无阻塞的多通道尝试读写,以及阻塞超时。
var c, c1, c2, c3 chan int
var i1, i2 int
select {
case i1 = <-c1: //如果能走通任何case则随机走一个
print( "received ", i1, " from c1\n" )
case c2 <- i2:
print( "sent ", i2, " to c2\n" )
case i3, ok := (<-c3):
if ok {
print( "received ", i3, " from c3\n" )
} else {
print( "c3 is closed\n")
}
default: // 如果case都阻塞,则走default,如果无default,则阻塞在case
// default中可以不读写任何通道,那么只要default提供不阻塞的出路,就相当于实现了对case的无阻塞尝试读写
print( "no communication\n")
}
2> 实现阻塞超时的方法是,只要不给default出路,而在case中实现一个超时
timeout := make (chan bool, 1)
go func () {
time.Sleep(1e9) // 这是等待1秒钟
timeout <- true
}()
// 用timeout这个通道作为阻塞超时的出路
select {
case <-ch:
// 处理从ch中读到的数据
case <-timeout:
// 如果case都阻塞了,那么1秒钟后会从这里找到出路
}