go 语言管道多路复用

多路复用概念

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
		}
	}
}