Go 并发三板斧:如何优雅地收集多个 goroutine 的结果?
### 写在前面在 Go 里写并发程序最常见的一个需求是**同时发起多个任务然后收集它们的结果。**但收集的方式不止一种。你是**全部等齐再处理**还是**谁先回来用谁的**还是**边回来边处理**这三种场景对应了 Go 并发编程里三种不同的模式。这篇文章带你一次性搞清楚。---## 场景设定假设我们有一个酒店后台系统需要同时查询三个数据源- 房价fetchPrice- 房态fetchRoomStatus- 客户偏好fetchPreference每个查询耗时 1-3 秒不等我们希望能用并发的方式加速。gotype QueryResult struct {Price stringRoom stringPrefer stringErr error}---## 模式一全部等齐再处理sync.WaitGroup这是最经典的用法**等所有任务都完成再统一返回。**gofunc queryAll(ctx context.Context, room string) QueryResult {var wg sync.WaitGroupvar mu sync.Mutexresult : QueryResult{}wg.Add(3)go func() {defer wg.Done()price, err : fetchPrice(ctx, room)mu.Lock()result.Price priceresult.Err errmu.Unlock()}()go func() {defer wg.Done()roomStatus, err : fetchRoomStatus(ctx, room)mu.Lock()result.Room roomStatusif err ! nil {result.Err err}mu.Unlock()}()go func() {defer wg.Done()prefer, err : fetchPreference(ctx, room)mu.Lock()result.Prefer preferif err ! nil {result.Err err}mu.Unlock()}()wg.Wait()return result}**特点**- 三个任务全部完成后wg.Wait() 才放行- 总耗时 最慢的那个任务- 适合需要完整数据的场景如生成报表、页面渲染---## 模式二谁先完成用谁的一次 select如果你只关心最快的那个结果可以用 select 取第一个回来的数据。gofunc queryAny(ctx context.Context, room string) QueryResult {ch : make(chan QueryResult, 3)go func() {price, err : fetchPrice(ctx, room)ch - QueryResult{Price: price, Err: err}}()go func() {roomStatus, err : fetchRoomStatus(ctx, room)ch - QueryResult{Room: roomStatus, Err: err}}()go func() {prefer, err : fetchPreference(ctx, room)ch - QueryResult{Prefer: prefer, Err: err}}()select {case result : -ch:return resultcase -ctx.Done():return QueryResult{Err: ctx.Err()}}}**特点**- 只取第一个返回的结果其余忽略- 总耗时 最快的那个任务- 适合竞争式查询如查多个缓存、多个供应商报价---## 模式三边完成边收集循环 select如果你既要**全部结果**又想**边完成边处理**可以用 for select 循环。gofunc queryAllWithSelect(ctx context.Context, room string) QueryResult {ch : make(chan QueryResult, 3)go func() {price, err : fetchPrice(ctx, room)ch - QueryResult{Price: price, Err: err}}()go func() {roomStatus, err : fetchRoomStatus(ctx, room)ch - QueryResult{Room: roomStatus, Err: err}}()go func() {prefer, err : fetchPreference(ctx, room)ch - QueryResult{Prefer: prefer, Err: err}}()result : QueryResult{}for i : 0; i 3; i {select {case part : -ch:if part.Price ! {result.Price part.Price}if part.Room ! {result.Room part.Room}if part.Prefer ! {result.Prefer part.Prefer}if part.Err ! nil result.Err nil {result.Err part.Err}case -ctx.Done():result.Err ctx.Err()return result}}return result}**特点**- 所有结果都能收到- 可以边收边处理如实时更新 UI 进度条- 总耗时 最慢的那个任务但不会卡死有超时保护---## 三种模式对比一览| 模式 | 工具 | 结果完整性 | 总耗时 | 适用场景 || :--- | :--- | :--- | :--- | :--- || 全部等齐 | sync.WaitGroup | ✅ 全部 | 最慢的任务 | 报表、完整页面 || 取最快 | 一次 select | ❌ 一个 | 最快的任务 | 缓存竞争、降级 || 边收边等 | 循环 select | ✅ 全部 | 最慢的任务 | 进度展示、实时更新 |---## 总结Go 的并发模型并不复杂但“收集结果”这个看似简单的需求其实有几种不同的实现方式。**选择哪个取决于你的业务需求**- 需要全部数据 用 WaitGroup- 只要最快的那一个 用 select- 全部都要还要实时反馈 用循环 select这三种模式你学会了吗

相关新闻

xAI开源Grok Build:Rust终端编程智能体架构全解与实战指南

xAI开源Grok Build:Rust终端编程智能体架构全解与实战指南

xAI开源Grok Build:Rust终端编程智能体架构全解与实战指南 2026年7月15日,埃隆马斯克旗下人工智能公司xAI做了一件让整个开发者社区始料未及的事:将其核心工程工具Grok Build的完整源代码开源至GitHub。这是xAI自2023年成立以来首次对外公开核…

2026/7/23 14:22:03阅读更多 →
Claude Code使用限额提升50%与延期政策详解:安装配置与优化指南

Claude Code使用限额提升50%与延期政策详解:安装配置与优化指南

Claude Code 使用限额提升与延期政策详解:开发者必看指南 最近在使用 Claude Code 进行开发时,很多用户都遇到了 "claude code 已达到 5 小时的使用上限。您的限额将在..." 的提示,这确实影响了开发效率。好消息是,官方…

2026/7/23 14:22:03阅读更多 →
TI bq27505-J2阻抗跟踪电量计:PFC配置、工作模式与寄存器详解

TI bq27505-J2阻抗跟踪电量计:PFC配置、工作模式与寄存器详解

1. 项目概述与核心价值在便携式电子设备的设计中,电池管理单元(BMU)的精度和可靠性直接决定了用户体验。你是否遇到过设备电量显示突然跳变、在低温环境下电量骤降,或者明明显示还有20%电量却瞬间关机的尴尬?这些问题的…

2026/7/23 14:20:02阅读更多 →
大数据技术学习路线与核心框架解析

大数据技术学习路线与核心框架解析

1. 大数据学习资源全景解析 大数据技术作为数字化转型的核心驱动力,已经渗透到各行各业。从电商推荐系统到金融风控,从智慧城市到医疗健康,掌握大数据技术成为现代技术人的必修课。这份资源清单将系统性地梳理大数据技术栈的学习路径、工具生…

2026/7/23 15:40:18阅读更多 →
如何优化AI生成的前端代码,避免同质化设计

如何优化AI生成的前端代码,避免同质化设计

1. 为什么AI生成的前端代码总带着"AI味"? 最近帮团队review了几个AI生成的前端项目,发现一个有趣现象:哪怕用不同AI工具(如Cursor、Claude Code Skill),产出的页面总带着相似的"AI味"。…

2026/7/23 15:40:18阅读更多 →
多AI协作系统:智能任务分发与上下文共享的技术实现

多AI协作系统:智能任务分发与上下文共享的技术实现

最近在开发圈里,一个看似简单的需求却让不少团队头疼:如何让多个AI助手在同一项目中协同工作?传统的单AI对话模式已经无法满足复杂项目的需求,而简单的多窗口切换又让开发效率大打折扣。 这正是"-你不再是孤身一人了-"…

2026/7/23 15:40:18阅读更多 →
原创角色动画生成与Meme化工具:环境部署与功能测试指南

原创角色动画生成与Meme化工具:环境部署与功能测试指南

这次我们来看一个关于 OC(原创角色)和水仙走路 meme 的项目,标题是“约的”。这个项目主要围绕原创角色的动画表现,特别是走路动作的 meme 化处理,适合对角色动画、meme 制作或本地化工具集成感兴趣的开发者。 从标题…

2026/7/23 15:40:18阅读更多 →
AI记忆系统演进与上下文工程优化实践

AI记忆系统演进与上下文工程优化实践

1. AI记忆系统的演进背景2017年Transformer架构的提出彻底改变了自然语言处理的游戏规则。作为从业者,我亲眼见证了从GPT-3到ChatGPT的质变过程——当模型参数量突破千亿级别时,那些令人惊艳的"涌现能力"开始显现。但真正让我夜不能寐的&#…

2026/7/23 15:40:18阅读更多 →
没有GPU算力怎么复现论文?无GPU条件下复现论文的实用方法指南

没有GPU算力怎么复现论文?无GPU条件下复现论文的实用方法指南

对于科研人员来说,文献工作往往伴随着两个极端的痛苦:一是搜索时的大海捞针,为了几篇核心文献,不得不花费数小时翻阅成百上千条琐碎的摘要;二是阅读时的翻译折磨,在专业术语和复杂的 LaTeX 公式间反复推敲&…

2026/7/23 15:38:18阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/23 0:56:31阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/23 0:56:31阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 0:56:31阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:00:28阅读更多 →
从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:28阅读更多 →
油泥处理设备哪里能买到

油泥处理设备哪里能买到

油泥处理设备哪里有?这是许多从事油田、炼化、清罐业务的从业者最关心的问题。根据河南三丰环保设备有限公司的行业经验,选购油泥处理设备的核心在于设备能否适配当地环保法规与原料特性,而非单纯看价格。该公司总经理王钦田先生指出&#xf…

2026/7/23 0:00:28阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/22 22:56:18阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/22 18:55:50阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/22 18:55:50阅读更多 →