文章目录
- 1. 概述
- 1.1 作用
- 1.2 和switch比较
- 1.3 执行过程
- 2. 语法示例
- 3. 完整示例
1. 概述
1.1 作用
监听channel的数据流动
1.2 和switch比较
- 相同
开始的一个新的选择块,每个选择条件由case语句来描述。
- 不同
- switch语句:可以选择任何使用相等比较的条件相比
- select语句:每个case语句里必须是一个IO操作
1.3 执行过程
-
Go会按顺序从头到尾评估每一个发送和接收的语句。
-
如果其中的任意一个语句可以继续执行(即没有被阻塞),那么就从那些可以执行的语句中任意选择一条来使用。
-
如果没有任意一条语句可以执行(即所有的通道都被阻塞),那么有两种可能的情况:
-
如果给出了default语句:那么就会执行default的流程。
-
如果没有default语句:那么select语句将被阻塞,直到至少有一个case可以进行下去
-
2. 语法示例
select {
case message := <-c1:
//c1有数据的操作
case message := <-c2:
//c2有数据的操作
default:
//默认操作
}
3. 完整示例
- 代码
package main
import (
"fmt"
"math/rand"
"strconv"
"time"
)
//创建生产者
func getInfo(src string) chan string {
seed := make(chan string)
go func() {
i := 0
for {
time.Sleep(time.Duration(rand.Intn(3000)) * time.Millisecond)
iStr:= strconv.Itoa(i)
info := src +"传来消息:"+ iStr
seed <- info
i++
}
}()
return seed
}
//创建消费者
func publishInfo() chan string {
c := make(chan string)
go func() {
for n := range c {
fmt.Println("==== 公布消息 ==== ", n)
}
}()
return c
}
func main() {
c1 := getInfo("魏")
c2 := getInfo("吴")
consumer := publishInfo()
for {
select {
case message := <-c1:
consumer <- message
case message := <-c2:
consumer <- message
//default:
// fmt.Println("默认值")
}
}
}
- 结果
==== 公布消息 ==== 吴传来消息:0
==== 公布消息 ==== 魏传来消息:0
==== 公布消息 ==== 魏传来消息:1
==== 公布消息 ==== 魏传来消息:2
==== 公布消息 ==== 魏传来消息:3
==== 公布消息 ==== 吴传来消息:1
==== 公布消息 ==== 魏传来消息:4
==== 公布消息 ==== 吴传来消息:2
==== 公布消息 ==== 吴传来消息:3
==== 公布消息 ==== 魏传来消息:5
==== 公布消息 ==== 魏传来消息:6
==== 公布消息 ==== 魏传来消息:7
==== 公布消息 ==== 魏传来消息:8
==== 公布消息 ==== 吴传来消息:4
==== 公布消息 ==== 吴传来消息:5
==== 公布消息 ==== 魏传来消息:9
==== 公布消息 ==== 吴传来消息:6
==== 公布消息 ==== 魏传来消息:10