go的select多路复用
传统的方法在遍历管道时,如果不关闭会阻塞而导致 deadlock ,在实际开发中,可能我们不好确定什么关闭该管道。使用select来获取channel里面的数据的时候不需要关闭channel
你也许会写出如下代码使用遍历的方式来实现:
for {
// 尝试从 ch1 接收值
data, ok := <-ch1
// 尝试从 ch2 接收值
data, ok := <-ch2
…
}
这种方式虽然可以实现从多个管道接收值的需求,但是运行性能会差很多。为了应对这种场
景, Go 内置了 select 关键字,可以同时响应多个管道的操作。
select 的使用类似于 switch 语句,它有一系列 case 分支和一个默认的分支。每个 case 会对
应一个管道的通信(接收或发送)过程。 select 会一直等待,直到某个 case 的通信操作完成
时,
就会执行 case 分支对应的语句
package mainimport ("fmt""time"
)func main() {// 在某些场景下我们需要同时从多个通道接收数据,这个时候就可以用到golang中给我们提供的select多路复用//1.定义一个管道 10个数据intintChan := make(chan int, 10)for i := 0; i < 10; i++ {intChan <- i}//2.定义一个管道 5个数据stringstringChan := make(chan string, 5)for i := 0; i < 5; i++ {stringChan <- "hello" + fmt.Sprintf("%d", i)}//使用select来获取channel里面的数据的时候不需要关闭channelfor {select {case v := <-intChan:fmt.Printf("从 intChan 读取的数据%d\n", v)time.Sleep(time.Millisecond * 50)case v := <-stringChan:fmt.Printf("从 stringChan 读取的数据%v\n", v)time.Sleep(time.Millisecond * 50)default:fmt.Printf("数据获取完毕")return //注意退出...}}}