Go 语言 select 都能做什么?
原文链接: Go 语言 select 都能做什么?
在 Go 语言中,select 是一个关键字,用于监听和 channel 有关的 IO 操作。
通过 select 语句,我们可以同时监听多个 channel,并在其中任意一个 channel 就绪时进行相应的处理。
本文将总结一下 select 语句的常见用法,以及在使用过程中的注意事项。
基本语法
select 语句的基本语法如下:
select {
case <-channel1:
// 通道 channel1 就绪时的处理逻辑
case data := <-channel2:
// 通道 channel2 就绪时的处理逻辑
default:
// 当没有任何通道就绪时的默认处理逻辑
}
看到这个语法,很容易想到 switch 语句。
虽然 select 语句和 switch 语句在表面上有些相似,但它们的用途和功能是不同的。
switch 用于条件判断,而 select 用于通道操作。不能在 select 语句中使用任意类型的条件表达式,只能对通道进行操作。
使用规则
虽然语法简单,但是在使用过程中,还是有一些地方需要注意,我总结了如下四点:
select语句只能用于通道操作,用于在多个通道之间进行选择,以监听通道的就绪状态,而不是用于其他类型的条件判断。select语句可以包含多个case子句,每个case子句对应一个通道操作。当其中任意一个通道就绪时,相应的case子句会被执行。- 如果多个通道都已经就绪,
select语句会随机选择一个通道来执行。这样确保了多个通道之间的公平竞争。 select语句的执行可能是阻塞的,也可能是非阻塞的。如果没有任何一个通道就绪且没有默认的default子句,select语句会阻塞,直到有一个通道就绪。如果有default子句,且没有任何通道就绪,那么select语句会执行default子句,从而避免阻塞。
多路复用
select 最常见的用途之一,同时监听多个通道,并根据它们的就绪状态执行不同的操作。
package main
import (
"fmt"
"time"
)
func main() {
c1 := make(chan string)
c2 := make(chan string)
go func() {
time.Sleep(3 * time.Second)
c1 <- "one"
}()
go func() {
time.Sleep(3 * time.Second)
c2 <- "two"
}()
select {
case msg := <-c1:
fmt.Println(msg)
case msg := <-c2:
fmt.Println(msg)
}
}
执行上面的代码,程序会随机打印 one 或者 two,如果通道为空的话,程序就会一直阻塞在那里。
非阻塞通信
当通道中没有数据可读或者没有缓冲空间可写时,普通的读写操作将会阻塞。
但通过 select 语句,我们可以在没有数据就绪时执行默认的逻辑,避免程序陷入无限等待状态。
package main
import (
"fmt"
)
func main() {
channel := make(chan int)
select {
case data := <-channel:
fmt.Println("Received:", data)
default:
fmt.Println("No data available.")
}
}
执行上面代码,程序会执行 default 分支。
输出:
No data available.
超时处理
通过结合 select 和 time.After 函数,我们可以在指定时间内等待通道就绪,超过时间后执行相应的逻辑。
package main
import (
"fmt"
"time"
)
func main() {
channel := make(chan int)
select {
case data := <-channel:
fmt.Println("Received:", data)
case <-time.After(3 * time.Second):
fmt.Println("Timeout occurred.")
}
}
执行上面代码,如果 channel 在 3 秒内没有数据可读,select 会执行 time.After 分支。
输出:
Timeout occurred.
以上就是本文的全部内容,如果觉得还不错的话欢迎点赞,转发和关注,感谢支持。
推荐阅读:
Go 语言 select 都能做什么?的更多相关文章
- PHP语言学习之php做图片上传功能
本文主要向大家介绍了PHP语言学习之php做图片上传功能,通过具体的内容向大家展示,希望对大家学习php语言有所帮助. 今天来做一个图片上传功能的插件,首先做一个html文件:text.php < ...
- MySQL 使用SELECT ... FOR UPDATE 做事务写入前的确认(转)
Select…For Update语句的语法与select语句相同,只是在select语句的后面加FOR UPDATE [NOWAIT]子句. 该语句用来锁定特定的行(如果有where子句,就是满足w ...
- [语法]C语言中二维数组做输入参数
C语言中二维数组做输入参数时, 可以同时指定各维长度, 可以只指定第二维的长度, 不可以只指定第一维的长度, 不可以各维长度都不指定. 一句话总结:要指定至少指定第二维,都不指定是不行的. 具体栗子如 ...
- NodeJS什么都能做,为什么还要JAVA?
这张图看起来简单而且很好理解,但没尝试过,会有很多疑问. SPA模式中,后端已供了所需的数据接口,view前端已经可以控制,为什么要多加NodeJS这一层? 多加一层,性能怎么样? 多加一层,前端的工 ...
- Java 程序员每天都在做什么?
作为一名 在大.中.小微企业都待过 的 Java 开发者,今天和大家分享下自己在不同公司的工作日常和收获.包括一些个人积累的工作提升经验,以及一些 Java 学习的方法和资源. 先从我的第一份 Jav ...
- 微信小程序来了,小程序都能做些什么
2017年的微信大动作就是微信小程序了,到底小程序都能做些什么?这是很多人关注的热点,小程序开发对企业又有什么帮助呢?下面让厦门微信小程序开发公司来为你就分析下. 微信小程序与APP的关系 ...
- 腾讯QQ会员技术团队:人人都可以做深度学习应用:入门篇(下)
四.经典入门demo:识别手写数字(MNIST) 常规的编程入门有"Hello world"程序,而深度学习的入门程序则是MNIST,一个识别28*28像素的图片中的手写数字的程序 ...
- linux c语言 select函数用法
linux c语言 select函数用法 表头文件 #i nclude<sys/time.h> #i nclude<sys/types.h> #i nclude<unis ...
- 【腾讯Bugly干货分享】人人都可以做深度学习应用:入门篇
导语 2016年,继虚拟现实(VR)之后,人工智能(AI)的概念全面进入大众的视野.谷歌,微软,IBM等科技巨头纷纷重点布局,AI 貌似将成为互联网的下一个风口. 很多开发同学,对人工智能非常感兴趣, ...
- Muduo学习笔记(一) 什么都不做的EventLoop
Muduo学习笔记(一) 什么都不做的EventLoop EventLoop EventLoop的基本接口包括构造.析构.loop(). One Loop Per Thread 一个线程只有一个Eve ...
随机推荐
- C# 打开蓝牙设置界面
蓝牙设置相关界面,以下是通过C#方式打开的几个方式,记录一下 蓝牙设置界面 1.控制面板命令bthprops.cpl 可以用控制面板 control+bthprops.cpl,也可以直接bthprop ...
- 1分钟了解C语言正确使用字节对齐及#pragma pack的方法
C/C++编译器的缺省字节对齐方式为自然对界.即在缺省情况下,编译器为每一个变量或是数据单元按其自然对界条件分配空间. 在结构中,编译器为结构的每个成员按其自然对界(alignment)条件分配空 ...
- 分享一个提高运维效率的 Python 脚本
哈喽大家好我是咸鱼,今天给大家分享一个能够提升运维效率的 python 脚本 咸鱼平常在工作当中通常会接触到下面类似的场景: 容灾切换的时候批量对机器上的配置文件内容进行修改替换 对机器批量替换某个文 ...
- HTB靶场之-inject
准备: 攻击机:虚拟机kali. 靶机:Inject,htb网站:https://www.hackthebox.com/,靶机地址:https://app.hackthebox.com/machine ...
- 2022-10-04:以下go语言代码输出什么?A:{123} main.T{x:123} B:{123} T{x:123} C:boo boo D:boo main.T{x:123}。 packag
2022-10-04:以下go语言代码输出什么?A:{123} main.T{x:123} B:{123} T{x:123} C:boo boo D:boo main.T{x:123}. packag ...
- 2021-06-03:布尔运算。给定一个布尔表达式和一个期望的布尔结果 result,布尔表达式由 0 (false)、1 (true)、& (AND)、 | (OR) 和 ^ (XOR) 符号组成。
2021-06-03:布尔运算.给定一个布尔表达式和一个期望的布尔结果 result,布尔表达式由 0 (false).1 (true).& (AND). | (OR) 和 ^ (XOR) 符 ...
- vs2022的一些调试技巧——远程调试&线程检查&性能检查
visual studio一直都是.net/c#开发人员最受欢迎的编译器,除了强大的代码提示和项目模板,还拥有大量的调试工具,这一期我们介绍下code freeze阶段的一些调试技巧.包括测试环境/生 ...
- STP生成树实验
实验拓扑 实验需求 所有设备都运行STP 改变阻塞端口 实验步骤 1.所有设备都运行STP ,等到收敛完毕,观察状态 [SW1]stp mode stp [SW2]stp mode stp [SW3] ...
- MQ系列13:消息大量堆积如何为解决
MQ系列1:消息中间件执行原理 MQ系列2:消息中间件的技术选型 MQ系列3:RocketMQ 架构分析 MQ系列4:NameServer 原理解析 MQ系列5:RocketMQ消息的发送模式 MQ系 ...
- TLS详解(原理和实践)
主页 个人微信公众号:密码应用技术实战 个人博客园首页:https://www.cnblogs.com/informatics/ 引言 本文主要内容涉及到TLS协议发展历程.TLS协议原理以及在HTT ...