当前位置: 首页 > news >正文

【go】select 语句case的随机性

在 Go 的 select 语句中,case 的匹配是随机的,并非按照顺序逐一匹配。以下是具体的机制和行为解释:


1. select 匹配机制

  • select 会同时监听所有 case 分支中的通道操作。
  • 如果多个 case 分支的条件同时满足(例如通道可读或可写):
    • Go 会随机选择一个满足条件的 case 来执行。
    • 这保证了 select 语句的非确定性,可以避免偏向某些通道。
  • 如果没有任何 case 条件满足:
    • 如果存在 default 分支,则执行 default 分支。
    • 如果没有 default 分支,select 会阻塞,直到某个 case 满足条件。

2. 示例代码

随机匹配的行为
package mainimport ("fmt""time"
)func main() {ch1 := make(chan string)ch2 := make(chan string)// 启动两个 Goroutine 向通道发送数据go func() { ch1 <- "Message from ch1" }()go func() { ch2 <- "Message from ch2" }()// 使用 select 监听通道select {case msg := <-ch1:fmt.Println(msg)case msg := <-ch2:fmt.Println(msg)}
}

可能输出
  • Message from ch1
  • Message from ch2
  • 输出是随机的,取决于哪个通道先被 Go 运行时选中。

3. 顺序匹配的假象

Go 的 select 本身没有顺序匹配,但如果程序的逻辑导致某些通道更早满足条件,会显得像是按顺序执行。例如:

 

package mainimport ("fmt""time"
)func main() {ch1 := make(chan string)ch2 := make(chan string)go func() {time.Sleep(1 * time.Second)ch1 <- "Message from ch1"}()go func() {time.Sleep(2 * time.Second)ch2 <- "Message from ch2"}()select {case msg := <-ch1:fmt.Println(msg)case msg := <-ch2:fmt.Println(msg)}
}

输出
  • Message from ch1
  • 因为 ch1 会在 1 秒后准备好,而 ch2 需要 2 秒,所以 ch1case 会更早满足条件。

4. 总结

特性说明
匹配机制多个 case 同时满足时,随机选择一个执行。
单个满足如果只有一个 case 满足条件,则直接执行该分支。
无匹配如果没有满足条件的 case 且无 defaultselect 阻塞。
default如果存在 default,且无 case 满足条件,则立即执行 default
顺序执行不是按代码顺序匹配,但某些条件可能使某个通道更早满足条件,看似按顺序。

通过随机匹配和阻塞机制,select 为 Go 并发提供了灵活且公平的通道操作能力。


http://www.mrgr.cn/news/79129.html

相关文章:

  • 【Java Nio Netty】基于TCP的简单Netty自定义协议实现(万字,全篇例子)
  • Elasticsearch 架构及 Lucene 索引结构原理入门
  • 安卓主板_MTK联发科android主板方案
  • 刷题日志【5】
  • 计算机的错误计算(一百八十三)
  • QT数据库(二):QSqlQueryModel实现数据查询
  • Python矩阵并行计算;CuPy-CUDA 实现显存加速:;在Python中实现显存加速或卸载;CuPy 和 NumPy 区别
  • compose组件库
  • java调用cmdsh命令
  • 流媒体之linux下离线部署FFmpeg 和 SRS
  • MongoDB集群的介绍与搭建
  • 【测试工具JMeter篇】JMeter性能测试入门级教程(七):JMeter断言
  • pset2 substitution.c
  • Linux内核__setup 宏的作用及分析
  • [go-redis]客户端的创建与配置说明
  • ansible自动化运维(二)ad-hoc模式
  • 网络层总结
  • 基于TensorFlow框架的线性回归实现
  • AI处理器组合--华为OD机试2024年E卷
  • 两个畸变矩阵相乘后还是一个2*2的矩阵,有四个畸变元素。1、畸变矩阵吸收了法拉第矩阵。2、畸变矩阵也给法拉第旋转角带来模糊(求解有多种可能)
  • Scala:正则表达式
  • Transformers在计算机视觉领域中的应用【第3篇:Swin Transformer——多层次的Vision Transformer】
  • 快速上手 RabbitMQ:使用 Docker 轻松搭建消息队列系统
  • JS中的浅拷贝,深拷贝和引用
  • 【JuMP.jl】非线性规划
  • 项目开发之Jenkins