04-select语句

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

posted on   运维开发玄德公  阅读(17)  评论(0编辑  收藏  举报  

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2021-12-26 09-golang连接mysql数据库-01.基本使用(mysql的连接和增删改查)
2021-12-26 Ubuntu截图工具-flameshot
2021-12-26 java环境安装
2021-12-26 Ubuntu安装DBeaver
2021-12-26 apt安装vim 报错“下列软件包有未满足的依赖关系“
2021-12-26 dbeaver连接mysql报错 “Public Key Retrieval is not allowed“
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示