select介绍
从不同并发执行的协程中,获取数据可以用select
来完成。select
监听的多个通道,也可以用通道发送数值。
select
的使用类似于switch语句,它有一系列case分支和一个默认的分支。每个case会对应一个通道的通信(接收或发送)过程。select
会一直等待,直到某个case
的通信操作完成时,就会执行case
分支对应的语句。具体格式如下:
select{
case <-ch1:
...
case data := <-ch2:
...
case ch3<-data:
...
default:
默认操作
}
select的基本用法
- 如果多个通道都阻塞了,会等待知道其中一个通道可以处理。
- 如果多个通道都可以处理,随机选取一个处理。
- 如果没有通道操作可以操作并且写了default语句,会执行:default(永远是可以运行的)
- 如果防止select堵塞,可以写default来确保发送不被堵塞,没有case的select就会一直堵塞。
- 当select做选择case和default操作时,case的优先级大于default。
- select语句实现了一种监听模式,通常在无限循环中使用,通过在某种情况下,通过break退出循环。
举个小例子来演示下select
的使用:
func main() {
ch := make(chan int, 1)
for i := 0; i < 10; i++ {
select {
case x := <-ch:
fmt.Println(x)
case ch <- i:
}
}
}
0
2
4
6
8
网友评论