select
select
当程序有多个channel协同工作,ch1,ch2,某一时刻,ch1或者ch2触发了,程序要做响应的处理。使用select来监听多个通道,当管道被触发时(写入数据,读取数据,关闭管道)。
select语法与switch case很像,但是所有的分支条件都必须是通道IO。它有一系列case分支和一个默认的分支。每个case会对应一个通道的通信(接收或发送或者关闭)过程。select
会一直等待,直到某个case
的通信操作完成时,就会执行case
分支对应的语句。具体格式如下:
select{
case <-ch1:
...
case data := <-ch2:
...
case ch3<-data:
...
default:
默认操作
}
列子:
package main
import (
"fmt"
"time"
)
func main() {
ch1 := make(chan int)
ch2 := make(chan int)
//开一个goroutine往ch1写数据
go func() {
for i := 0; i < 10; i++ {
ch1 <- i
time.Sleep(time.Second / 2)
}
}()
//开一个goroutine往ch2写数据
go func() {
for i := 0; i < 10; i++ {
ch2 <- i
time.Sleep(time.Second)
}
}()
for {
select {
case data1 := <-ch1:
fmt.Println("从ch1读取数据成功,data1:", data1)
case data2 := <-ch2:
fmt.Println("从ch2读取数据成功,data2:", data2)
default:
fmt.Println("select default分支called")
time.Sleep(time.Second)
}
}
}
使用select
语句能提高代码的可读性。
- 可处理一个或多个channel的发送/接收操作。
- 如果多个
case
同时满足,select
会随机选择一个。 - 对于没有
case
的select{}
会一直等待,可用于阻塞main函数。