select是类UNIX系统提供的一个多路复用系统API,Go语言借用多路复用的概念,提供select关键字,用于多路监听多个通道。当监听的通道没有状态可读或者可写的,select是阻塞的,只要监听的通道中有一个状态是可读或者可写的,则select就不会阻塞,而是进入处理就绪通道的分支流程。如果监听的状态有多个可读或者可写的状态,则select则随机选取一个处理。实例如下:
package main
import "fmt"
func main() {
ch := make(chan int, 1)
go func(chan int) {
for {
select {
//0或者1写入随机的
case ch <- 0:
case ch <- 1:
}
}
}(ch)
for i := 0; i < 10; i++ {
fmt.Println(<-ch)
}
}
输出结果:
1
0
0
1
0
0
1
1
0
1