GoLang的select是什么?在什么时候场景下用

news2025/3/10 0:21:12

在 Go 语言中,select 是专门用于处理通道(Channel)多路复用的关键字,它可以同时监听多个通道的读写操作,并根据就绪的通道执行对应的逻辑。以下是 select 的用法和典型应用场景:

一、基本用法

select 语法类似于 switch,但每个 case 必须是一个通道操作(发送或接收)。select 会阻塞,直到某个 case 对应的通道操作就绪,然后执行该 case 的代码。如果有多个 case 同时就绪,会随机选择一个执行。

select {
case data := <-ch1:  // 监听 ch1 的接收操作
    fmt.Println("Received from ch1:", data)
case ch2 <- 42:      // 监听 ch2 的发送操作
    fmt.Println("Sent to ch2")
case <-time.After(1 * time.Second):  // 超时控制
    fmt.Println("Timeout")
}

文章目录

    • 一、基本用法
    • 二、核心应用场景
        • 1. 多通道监听
        • 2. 超时控制
        • 3. 任务取消(Cancellation)
        • 4. 非阻塞操作(Default Case)
        • 5. 并发任务协调

二、核心应用场景

1. 多通道监听
select {
case res := <-api1Chan:
    fmt.Println("API1 response:", res)
case res := <-api2Chan:
    fmt.Println("API2 response:", res)
}
2. 超时控制

场景:避免某个通道操作永久阻塞,强制结束长时间未响应的操作。

示例:结合 time.After 实现超时逻辑。

select {
case data := <-ch:
    fmt.Println("Received:", data)
case <-time.After(3 * time.Second):
    fmt.Println("Timeout: No data received")
}

三、执行流程

  1. 当执行到 select 语句时,它会监听页面 case 中的两个通道操作:从 ch 接收数据和从 time.After 返回的通道接收数据。

  2. 如果此时通道 ch 中有数据发送,那么第一个分支会被执行,接收到数据并打印,然后 select 语句结束。

  3. 如果通道 ch 中没有数据发送,那么 select 会等待,直到 3 秒后 time.After 返回的通道发送数据,此时第二个分支被执行,打印超时信息,select 语句结束。

  4. 如果在等待过程中,通道 ch 收到数据的时间刚好在 3 秒内,那么第一个分支会优先执行,因为一旦有通道操作可以执行,select 就会选择执行对应的分支,而不会等待其他分支的操作完成。

这种代码结构在处理需要等待某个事件发生,同时又不想无限期等待的场景时非常有用,比如在网络编程中等待服务器响应、在并发任务中等待某个任务完成等场景,可以有效地避免程序因某个操作长时间没有响应而陷入死等状态。

3. 任务取消(Cancellation)

场景:通过监听一个取消通道(如 context.Done()),主动终止协程。

示例:使用 context 实现优雅退出。

# 定时5秒后结束
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

select {
case <-ctx.Done():
    fmt.Println("Operation cancelled:", ctx.Err())
case result := <-workChan:
    fmt.Println("Work completed:", result)
}
4. 非阻塞操作(Default Case)

场景:尝试发送或接收数据,若无法立即执行,则执行默认逻辑。

示例:非阻塞读取通道。

select {
case data := <-ch:
    fmt.Println("Data received:", data)
default:
    fmt.Println("No data available")
}
5. 并发任务协调

场景:等待多个并发任务完成,收集第一个结果或全部结果。

示例:等待多个服务返回,取最快的结果。

ch1 := make(chan string)
ch2 := make(chan string)

go fetchFromService1(ch1)
go fetchFromService2(ch2)

select {
case res := <-ch1:
    fmt.Println("Result from Service1:", res)
case res := <-ch2:
    fmt.Println("Result from Service2:", res)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2312408.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQLAlchemy系列教程:集成Pydantic增强数据处理能力

本教程介绍如何将Pydantic用于数据验证&#xff0c;SQLAlchemy用于数据库操作&#xff0c;从而通过强大的数据处理能力增强Python应用程序。 介绍 在现代web开发中&#xff0c;确保数据的有效性和完整性至关重要。Pydantic和SQLAlchemy是两个功能强大的Python库&#xff0c;可…

【数据结构初阶】---堆的实现、堆排序以及文件中的TopK问题

1.树的概念及结构 1.1树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有一个特殊的结点&…

IP,MAC,ARP 笔记

1.什么是IP地址 IP 地址是一串由句点分隔的数字。IP 地址表示为一组四个数字&#xff0c;比如 192.158.1.38 就是一个例子。该组合中的每个数字都可以在 0 到 255 的范围内。因此&#xff0c;完整的 IP 寻址范围从 0.0.0.0 到 255.255.255.255。 IP 地址不是随机的。它们由互…

【记录】Python3|Linux下安装Virtualenv和virtualenvwrapper用于处理虚拟环境

之前写过一篇Anaconda的&#xff1a;【安装】Python3&#xff5c;Windows下安装Anaconda、pytorch&#xff0c;以及修改pip默认安装路径_anaconda pip修改安装的包路径-CSDN博客 还写过一篇专门讲所有虚拟环境的&#xff1a;【记录】环境&#xff5c;Ubuntu18.04 Python 开发环…

VSTO(C#)Excel开发3:Range对象 处理列宽和行高

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

Selenium库打开指定端口(9222、9333等)浏览器【已解决!!!】

就是在写动态爬虫爬取数据的过程中&#xff0c;如果用selenium的话&#xff0c;有一个缺点&#xff0c;就是当我们去测试一个网站能不能爬取&#xff0c;它都会重新换端口打开一个浏览器&#xff0c;不会使用上一次使用的浏览器&#xff0c;在实际使用过程中这样调试很烦&#…

蓝桥杯备考:倍增算法详解

如果我们想暴力求解的话&#xff0c;我们的时间复杂度是O&#xff08;N&#xff09;b最大是10的9次方&#xff0c;这时候我们一定会超时 #include <iostream> using namespace std;typedef long long LL; LL a,b,p;LL ret 1; int main() {cin >> a >> b &g…

SQL经典查询

查询不在表里的数据&#xff0c;一张学生表&#xff0c;一张学生的选课表&#xff0c;要求查出没有选课的学生&#xff1f; select students.student_name from students left join course_selection on students.student_idcourse_selection.student_id where course_selecti…

## DeepSeek写水果记忆配对手机小游戏

DeepSeek写水果记忆配对手机小游戏 提问 根据提的要求&#xff0c;让DeepSeek整理的需求&#xff0c;进行提问&#xff0c;内容如下&#xff1a; 请生成一个包含以下功能的可运行移动端水果记忆配对小游戏H5文件&#xff1a; 要求 可以重新开始游戏 可以暂停游戏 卡片里的水果…

【GoTeams】-5:引入Docker

本文目录 1. Dokcer-compose回顾下Docker知识编写docker-compose.yaml运行docker 2. 部署go服务编写dockerfile 1. Dokcer-compose 这里简单先用一下win版本的Docker&#xff0c;后期开发好了部署的时候再移植到服务器下进行docker部署。 输入命令docker-compose version 就可…

将自定义vue组件加载在Mapbox或Maplibre的marker和popup上

1. 使用场景 在开发WebGIS应用时&#xff0c;我们常需要将自定义UI组件与地图元素结合。本文介绍如何将Vue组件集成到Mapbox/Maplibre的Marker标记点和Popup弹窗中&#xff0c;实现动态交互式的地图功能。 2. 为什么需要特殊处理&#xff1f; 在常规开发中我们大多的处理是 …

GB28181视频监控流媒体平台LiveGBS如何自定义收流端口区间以便减少收流端口数或解决端口冲突问题

LiveGBS GB28181流媒体服务在接收视频的时候默认是使用30000-30249&#xff0c; webrtc流播放端口区间默认是UDP的30250-30500区间。有些网络环境不方便开放这么大的端口区间&#xff0c;下面介绍下如何修改配置这个区间。 从页面上修改这个区间&#xff0c;端口区间尽量设置大…

rabbitmq-amqp事务消息+消费失败重试机制+prefetch限流

1. 安装和配置 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency><dependency> <groupId>com.fasterxml.jackson.core</groupId> <arti…

golang 从零单排 (一) 安装环境

1.下载安装 打开网址The Go Programming Language 直接点击下载go1.24.1.windows-amd64.msi 下载完成 直接双击下一步 下一步 安装完成 环境变量自动设置不必配置 2.验证 win r 输入cmd 打开命令行 输入go version

康谋分享 | 3DGS:革新自动驾驶仿真场景重建的关键技术

随着自动驾驶技术的迅猛发展&#xff0c;构建高保真、动态的仿真场景成为了行业的迫切需求。传统的三维重建方法在处理复杂场景时常常面临效率和精度的挑战。在此背景下&#xff0c;3D高斯点阵渲染&#xff08;3DGS&#xff09;技术应运而生&#xff0c;成为自动驾驶仿真场景重…

【够用就好008】开新坑自学esb32烧录进军物联网和嵌入式

见字如面&#xff0c;这里是AKA AIGC创意人竹相左边。 学习使用了三年的AI工具&#xff0c;现在最大的自信就是业余时间可以学习任何自己感兴趣的事&#xff0c;感觉手搓火箭也不是梦。 今天开个新坑&#xff0c;也是逐步探索想要进入的新世界。物联网&#xff08;IoT&#…

Go红队开发—格式导出

文章目录 输出功能CSV输出CSV 转 结构体结构体 转 CSV端口扫描结果使用CSV格式导出 HTML输出Sqlite输出nmap扫描 JSONmap转json结构体转jsonjson写入文件json编解码json转结构体json转mapjson转string练习&#xff1a;nmap扫描结果导出json格式 输出功能 在我们使用安全工具的…

element-plus中table组件的使用

1、table组件的基本使用 注意&#xff1a; ①对象集合&#xff0c;要从后端查询。 ②prop是集合中的对象的属性名&#xff1b;label是表格表头的名称。 2、将性别一列的71转为男&#xff0c;72转为女 问题描述&#xff1a; 解决步骤&#xff1a; ①将el-table-column变成双标签…

Go加spy++隐藏窗口

最近发现有些软件的窗口就像狗皮膏药一样&#xff0c;关也关不掉&#xff0c;一点就要登录&#xff0c;属实是有点不爽了。 窗口的进程不能杀死&#xff0c;但是窗口我不想要。思路很简单&#xff0c;用 spy 找到要隐藏的窗口的句柄&#xff0c;然后调用 Windows 的 ShowWindo…

网络安全通信架构图

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 在安全通信里面我经常听到的2个东西就是SSL和TLS&#xff0c;这2个有什么区别呢&#xff1f;以及HTTPS是怎么通信的&#xff1f;包括对称加密、非对称加密、摘要、…