04-select语句
1.01-包引用和引用顺序2.02-运算符号、标识符、注释、关键字3.03-变量和作用域4.02-常量(const)5.03-数组(array)6.04-切片(slice)7.05-map8.06-指针(pointer)9.07-通道(channel)10.08-结构体(struct)11.01-if语句12.02-for循环
13.04-select语句
14.03-switch语句15.make()、new()16.copy(切片间复制)17.append(增加切片成员)18.delete(删除map的成员)19.panic&recover20.03-匿名函数和闭包21.01-函数简单使用22.02-形参和实参23.04-递归函数24.05-方法25.06-接口(interface)26.01-并发27.02-携程通讯28.03-携程同步29.01-连接和建表30.02-创建数据31.03-基本查询32.04-高级查询33.05-初始化34.06-更新数据35.07-删除数据36.08 事务37.根据操作系统程序自动选择不同常量38.golang字串的base64编码解码39.golang数据类型转换40.golang 时间/时间戳的获取和转换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
分类:
go语言开发 / go基础
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源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“