Select多路复用
在某些场景下,需要同时从多个通道接收数据。数据在接收数据时,如果没有数据可以接收将会发生阻塞。为了应对这种场景,Go内置了select
关键字,可以同时相应多个通道的操作。select的使用类似于switch语句,其有一列case分支和一个默认分支。每一个case会对应一个通道的通信过程。select
会一直等待,知道某个case
的通信操作完成,就会执行case
分支对应的语句。
select{
case <- ch1:
...
case data := <- ch2:
...
case ch3 <- data:
....
default:
默认操作...
}
例:
func main(){
ch := make(chan int, 1)
for i := 0; i < 10; i++{
select{
case x := <- ch:
fmt.Println(x)
case ch <- i:
}
}
}
使用select
语句可以提高代码的可读性,如果多个case
同时满足,select
会随机选择一个。对于没有case
的select{}
会一直等待。