1、select是Go中的一个控制结构,类似于switch语句,用于处理异步IO操作。select会监听case语句中channel的读写操作,当case中channel读写操作为非阻塞状态(即能读写)时,将会触发相应的动作。
2、select中的case语句必须是一个channel操作,select中的default子句总是可运行的。
3、如果有多个case都可以运行,select会随机公平地选出一个执行,其他不会执行。
4、如果没有可运行的case语句,且有default语句,那么就会执行default的动作。
5、如果没有可运行的case语句,且没有default语句,select将阻塞,直到某个case通信可以运行
例子:
func generator() chan int {
out := make(chan int)
go func() {
i := 0
for{
time.Sleep(time.Duration(rand.Intn(1000))*time.Millisecond)
out <- i
i++
}
}()
return out
}
func work(id int, c chan int) {
for n := range c {
fmt.Printf("Worker %d received %d\n",
id, n)
}
}
func GoWork(id int) chan<- int {
c := make(chan int)
go work(id, c)
return c
}
func main(){
var c1,c2 = generator(),generator() //c1,c2 ==nil
w := GoWork(0)
for{
select {
case n := <- c1:
w <- n //这样不好,收一个数之后,后面的操作又会阻塞,最后的出的结果是由顺序的,一个任务结束之后才可以进行下一个
case n :