尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
GO_并发编程---select
一、select 基础介绍1. select 与 switch 区别switch匹配相等条件可写任意表达式select每个 case 只能是 channel IO 操作读通道 / 写通道专门用于同时监听多个通道读写状态。2. select 标准语法结构goselect { case -chan1: // 通道chan1可读执行该分支 case chan2 - 100: // 通道chan2可写执行该分支 default: // 所有case都阻塞无就绪IO时立刻执行default非阻塞 }3. 核心执行规则扫描所有 case收集当前就绪的通道 IO 分支若多个 case 同时就绪随机选择其中一个执行无固定顺序若无任何 case 就绪且存在default直接走 default不阻塞若无任何 case 就绪、也无 defaultselect 永久阻塞直到某个通道 IO 就绪。二、实战案例 1select 实现斐波那契数列多通道监听生产 退出信号需求生产者持续向通道写入斐波那契数字消费者读取 8 个数字后发送退出信号生产者收到信号结束协程。gopackage main import fmt // 生产者ch只写quit只读 func fibonacci(ch chan- int, quit -chan bool) { x, y : 1, 1 for { select { case ch - x: // 成功写入数字更新斐波那契 x, y y, xy case flag : -quit: // 收到退出信号结束生产者协程 fmt.Println(flag , flag) return } } } func main() { ch : make(chan int) // 传输斐波那契数字 quit : make(chan bool) // 退出信号通道 // 消费者协程读取8个数字后发送退出信号 go func() { for i : 0; i 8; i { num : -ch fmt.Println(num) } // 读取完成通知生产者退出 quit - true }() // 启动生产者 fibonacci(ch, quit) fmt.Println(程序结束) }流程梳理主协程启动消费者协程fibonacci通过 select 同时监听「写数字通道」和「退出通道」前 8 次ch 可写持续输出 1,1,2,3,5,8,13,21读完 8 个数字后消费者向 quit 发送 trueselect 捕获 quit 通道数据生产者 return 退出函数。三、实战案例 2select 配合 time.After 实现超时控制业务场景监听通道数据若 3 秒内没有数据到达判定为超时主动退出程序。gopackage main import ( fmt time ) func main() { ch : make(chan int) quit : make(chan bool) // 消费协程监听通道超时 go func() { for { select { case num : -ch: fmt.Println(num , num) case -time.After(3 * time.Second): fmt.Println(超时无数据输入) quit - true return } } }() // 主线程持续向通道发送5个数字间隔1秒 for i : 0; i 5; i { ch - i time.Sleep(time.Second) } // 等待超时信号 -quit fmt.Println(程序结束) }运行逻辑主线程每隔 1s 发送数字3 秒超时永远不会触发如果注释掉主线程发送逻辑3 秒后time.After通道就绪进入超时分支程序退出。四、select 关键知识点总结适用场景同时监听多个 channel的读写状态是协程多路复用核心case 限制只能是通道读 / 写操作不能是普通表达式多分支同时就绪随机任选一个执行default 作用让 select 变成非阻塞无就绪通道时直接执行 default超时经典用法case -time.After(时长)无需手动创建 Timer多信号协同可同时监听业务数据通道 退出信号通道优雅关闭协程。
RELATED

相关推荐

Ruflo实战指南:构建下一代智能体协同系统的核心技术解析

Ruflo实战指南:构建下一代智能体协同系统的核心技术解析

Ruflo实战指南:构建下一代智能体协同系统的核心技术解析 【免费下载链接】ruflo 🌊 The leading agent meta-harness. Deploy intelligent multi-player swarms, coordinate autonomous workflows, and build conversational AI systems. Features adapt…

📅 2026/9/13 16:47:47
5个实战场景深度解析:如何突破复杂Ruby应用打包的技术瓶颈

5个实战场景深度解析:如何突破复杂Ruby应用打包的技术瓶颈

5个实战场景深度解析:如何突破复杂Ruby应用打包的技术瓶颈 【免费下载链接】traveling-ruby Self-contained Ruby binaries that can run on any Linux distribution and any macOS machine. 项目地址: https://gitcode.com/gh_mirrors/tr/traveling-ruby Tr…

📅 2026/7/23 11:15:26
小白程序员轻松入门大模型应用开发,高薪就业新赛道等你来!

小白程序员轻松入门大模型应用开发,高薪就业新赛道等你来!

大模型应用开发聚焦于将先进AI能力工程化、产品化,已在智能客服、代码辅助等多个领域规模化落地。本文介绍了Python编程、提示词工程、RAG技术和AI Agent开发等核心技能,并提供了从零到就业的学习路径建议。大模型应用工程师是IT行业增长最快、薪资最高的…

📅 2026/7/23 21:45:22
MORE NEWS

更多资讯

📰

al-folio 如何用 upgrade CLI 跟踪本地 override 与插件 gem 更新的漂移?

al-folio 如何用 upgrade CLI 跟踪本地 override 与插件 gem 更新的漂移? 【免费下载链接】al-folio A beautiful, simple, clean, and responsive Jekyll theme for academics 项目地址: https://gitcode.com/GitHub_Trending/al/al-folio al-folio 的 v1.x…

📰

Android资源文件体系详解:res、assets与libs目录实践指南

1. Android资源文件体系概述在Android开发中,资源文件是构建应用的基础元素。作为一名有5年Android开发经验的工程师,我发现合理使用资源文件能显著提升开发效率和维护性。Android资源系统主要包含res、assets和libs三大目录,每个目录都有其特…

📰

WTF Solidity 极简入门:Solidity 控制流与插入排序实现,以及 uint 下溢(underflow)陷阱全解析

WTF Solidity 极简入门:Solidity 控制流与插入排序实现,以及 uint 下溢(underflow)陷阱全解析 【免费下载链接】WTF-Solidity WTF Solidity 极简入门教程,供小白们使用。Now supports English! 官网: https://wtf.acad…

📰

基于ZYNQ的远程固件升级系统:网口传输与QSPI固化实现

简介:基于ZYNQ平台的远程固件升级系统完整工程资料,面向FPGA与嵌入式开发人员,演示如何通过网口完成FPGA设备的远程固化升级。方案基于ALINX固件固化例程二次开发,并集成CRC32校验机制,保障传输与烧写过程的数据完整性…

📰

静态代码分析工具横向对比:从ESLint到SonarQube,如何选型与落地

很多团队的代码质量管控,其实一直卡在一个很尴尬的位置:代码评审靠人眼盯,低级错误靠运行时炸出来,线上出问题再回头补测试。我在经历过几次“本地运行得好好的,一上线就被空指针打脸”之后,彻底意识到&…

📰

Instructor Patching 机制深度解析:如何为 LLM 客户端注入结构化输出能力

Instructor Patching 机制深度解析:如何为 LLM 客户端注入结构化输出能力 【免费下载链接】instructor structured outputs for llms 项目地址: https://gitcode.com/GitHub_Trending/in/instructor Patching 是 Instructor 的核心机制之一:它不…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬