什么是通道多路复用?
-
同时处理接收和发送多个通道的数据
-
表示在一个信道上传输多路信号或数据流的过程和技术
举例:
电话是一个典型的多路复用设备,在一条线路上可以同时接收或发送数据
多通道操作的两个处理办法
-
使用
for
循环进行通道处理遍历 -
使用
select
关键字进行多通道响应
for
循环进行通道遍历
for{
// 接收ch1通道
data, ok := <-ch1
// 接收ch2通道
data, ok := <-ch2
// 接收后续通道
...
}
select
关键字进行通道遍历
select{
case 操作1:
响应操作1
case 操作2:
响应操作2
...
default:
没有操作的情况
}
select
的特点:
select
不像switch
,后面并不带判断条件,而是直接去查看 case
语句。每个case
语句都必须是一个面向channel
的操作
注意:
-
操作1、操作2是指:通道收发语句
操 作 | 语句示例 |
---|---|
接收任意数据 | case <- ch; |
接收变量 | case d := <- ch; |
发送数据 | case ch <- 100; |
-
default
:没有任何操作时,默认执行default
条件中的语句
示例:
package main
import "fmt"
/*
声明一个通道
使用死循环+select选择器进行通道操作
*/
func main() {
ch := make(chan int, 1)
// 开始循环对通道进行操作
for {
select {
case ch <- 0:
case ch <- 1:
}
// 赋值并打印
i := <-ch
fmt.Println("接收到的值是:", i)
}
}
特点: