博客园 ☜ golang select 的 case 执行顺序

简介: Go 语言的 `select` 语句用于等待多个通道操作就绪。当非阻塞的 chan1, chan2, chan3 同时可读时,`select` 会随机选择一个执行,之后的循环中其他未选中的 case 仍有执行机会。如果所有 case 都未准备好,将执行 default case。

问题:

golang select 结构,假如底下有三个case,分别从 chan1, chan2, chan3 读取内容,chan1, chan2, chan3都是非阻塞的,那么是会先进入第一个 case,其它case还会再进入吗 ?

在 Go 语言中,select 语句用于监控多个通道的操作,并在其中一个操作准备好时执行相应的 case。

如果多个 case 同时就绪,会选择一个执行,具体选择哪个 case 是随机的,无法预测。

 

对于非阻塞的通道读取(即通道中有值可读或写入不会导致阻塞时),select 的行为如下:

  1. 非阻塞: 如果chan1, chan2, 和 chan3 都是非阻塞的,并且在检查时都已有数据可读,则select会随机选择一个case执行。这意味着首次执行时可能进入chan1的case,但后续循环中也可能进入chan2或chan3的case。

  2. 循环执行: 在一次 select 执行完毕后,如果程序逻辑使其再次进入 select 语句,只要这些通道中仍有数据可读,其他未被选中的 case 仍有机会被执行。select会持续监控所有列出的case,每次选择一个准备好的case执行。

  3. 并发性: 如果在执行某个case的过程中,其他channel变得可读,但在当前select语句执行完成之前,这些新就绪的case不会被处理,需要等到下一次select检查时才有可能被选中执行。

  4. default case: 如果存在default子句,当所有列出的channel都没有准备好进行读写操作时,将执行default分支。这为 select 提供了在没有通道操作可执行时的一个备选路径。

 

总结来说,如果chan1, chan2, 和 chan3 都是非阻塞且有数据,每个循环迭代中 select 都会随机选择一个case执行,所有case都有机会被执行,但具体哪个先执行是不确定的。

相关文章
|
1月前
|
程序员 Go
Golang深入浅出之-Select语句在Go并发编程中的应用
【4月更文挑战第23天】Go语言中的`select`语句是并发编程的关键,用于协调多个通道的读写。它会阻塞直到某个通道操作可行,执行对应的代码块。常见问题包括忘记初始化通道、死锁和忽视`default`分支。要解决这些问题,需确保通道初始化、避免死锁并添加`default`分支以处理无数据可用的情况。理解并妥善处理这些问题能帮助编写更高效、健壮的并发程序。结合使用`context.Context`和定时器等工具,可提升`select`的灵活性和可控性。
35 2
|
12天前
|
Go
【golang】使用select {}
【golang】使用select {}
15 0
|
10月前
|
Go
golang面试官:for select时,如果通道已经关闭会怎么样?如果select中只有一个case呢?
golang面试官:for select时,如果通道已经关闭会怎么样?如果select中只有一个case呢?
111 1
|
1月前
|
存储 算法 Java
Golang底层原理剖析之多路select、channel数据结构和阻塞与非阻塞
Golang底层原理剖析之多路select、channel数据结构和阻塞与非阻塞
32 0
|
缓存 Go C++
Golang中select的四大用法
Golang中select的四大用法
85 0
|
Linux Go C++
golang select 机制和超时
golang select 机制和超时
77 0
|
Linux Go
学习golang(12) 初探:协程(3)多个chan之select选择器
学习golang(12) 初探:协程(3)多个chan之select选择器
182 0
|
存储 Go
Golang中的管道(channel) 、goroutine与channel实现并发、单向管道、select多路复用以及goroutine panic处理
Golang中的管道(channel) 、goroutine与channel实现并发、单向管道、select多路复用以及goroutine panic处理
424 0
|
消息中间件 Java 关系型数据库
保姆级别的RabbitMQ教程!一看就懂!(有安装教程,送安装需要的依赖包,送Java、Golang两种客户端教学Case) (一)
保姆级别的RabbitMQ教程!一看就懂!(有安装教程,送安装需要的依赖包,送Java、Golang两种客户端教学Case) (一)
704 0
|
消息中间件 Java Go
保姆级别的RabbitMQ教程!一看就懂!(有安装教程,送安装需要的依赖包,送Java、Golang两种客户端教学Case) (三)
保姆级别的RabbitMQ教程!一看就懂!(有安装教程,送安装需要的依赖包,送Java、Golang两种客户端教学Case) (三)
152 0