go 语言管道多路复用是指同时处理接收和发送多个通道的数据。
Go语言中提供了 select 关键字,可以同时响应多个通道的操作。select 的用法与 switch 语句非常类似,由 select 开始一个新的选择块,每个选择条件由 case 语句来描述。
与 switch 语句可以选择任何可使用相等比较的条件相比,select 有比较多的限制,其中最大的一条限制就是每个 case 语句里必须是一个 IO 操作,大致结构如下:
select{
case 操作1:
响应操作1
case 操作2:
响应操作2
…
default:
没有操作情况
}
操作1、操作2:包含通道收发语句,请参考 select 多路复用中可以接收的样式 :
操 作 语句示例
接收任意数据 case <- ch;
接收变量 case d := <- ch;
发送数据 case ch <- 100;
响应操作1、响应操作2:当操作发生时,会执行对应 case 的响应操作。
default:当没有任何操作时,默认执行 default 中的语句。
可以看出,select 不像 switch,后面并不带判断条件,而是直接去查看 case 语句。每个 case 语句都必须是一个面向 channel 的操作。
package main
import "strconv"
func main() {
chanInt := make(chan int, 100)
chanStr := make(chan string, 100)
counter := 1
for {
if counter > 10 {
break
}
chanInt <- counter
chanStr <- "hello " + strconv.Itoa(counter)
counter++
}
for {
select {
case v := <-chanInt:
println(v)
case v := <-chanStr:
println(v)
default:
return
}
}
}