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:21:55 阅读更多 →
Claude Code使用限额提升50%与延期政策详解:安装配置与优化指南

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

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

2026/7/23 14:21:55 阅读更多 →
Agentic AI与智能设备的融合:从感知到决策的实践

Agentic AI与智能设备的融合:从感知到决策的实践

1. Agentic AI与智能设备的融合革命当你的智能音箱不仅能播放音乐,还能主动提醒你"明天上午10点有会议,需要我现在帮你预约车辆吗?"——这就是Agentic AI在智能设备中的具象化体现。作为从业者,我见证了从简单指令响应到…

2026/7/23 14:20:54 阅读更多 →

最新新闻

MSPM0基本定时器TIMB深度解析:从原理到六大实战应用

MSPM0基本定时器TIMB深度解析:从原理到六大实战应用

1. 项目概述与TIMB核心价值 在嵌入式系统开发中,定时器(Timer)的地位,就如同我们现实世界中的钟表。无论是让一个LED灯以1秒的间隔闪烁,还是精确测量一个按键按下的时长,亦或是驱动一个电机的PWM信号&#…

2026/7/23 14:30:58 阅读更多 →
UCD90xxx电源管理芯片GPO与GPI高级配置实战指南

UCD90xxx电源管理芯片GPO与GPI高级配置实战指南

1. 项目概述与核心价值在服务器主板、通信基站或者高端工业控制器的研发过程中,电源系统的稳定性和可靠性是决定整个系统成败的基石。想象一下,一个由十几路甚至几十路不同电压、不同上电时序要求的电源轨构成的复杂系统,任何一路电源的异常&…

2026/7/23 14:30:58 阅读更多 →
同一需求做小程序和鸿蒙,我怎么选

同一需求做小程序和鸿蒙,我怎么选

我的结论很直接:志愿者从微信群临时报名,我选微信小程序;组织有固定鸿蒙设备、需要值守端常驻和系统通知,我才选鸿蒙应用。多端都能生成,不等于每一端都值得上线。 我是应用开发者,这次为社区活动做志愿者…

2026/7/23 14:30:58 阅读更多 →
AI大模型为何算不准四位数加减法?解析与优化方案

AI大模型为何算不准四位数加减法?解析与优化方案

1. 为什么AI大模型算不准四位数加减法? 最近有个特别有意思的现象:那些能写诗、编程、聊天的AI大模型,居然经常算错简单的四位数加减法。这就像让一个能背诵《莎士比亚全集》的文学教授做小学数学题,结果频频出错。今天我们就来深…

2026/7/23 14:30:58 阅读更多 →
Dify开源LLM应用平台:降低开发门槛的全流程解决方案

Dify开源LLM应用平台:降低开发门槛的全流程解决方案

1. Dify项目概述:LLM应用开发新范式Dify作为一款面向开发者的开源LLM应用平台,正在重新定义大语言模型应用的构建方式。这个由LangGenius团队打造的项目,在GitHub上已获得超过50,000颗星标,成为2024年最受开发者关注的AI基础设施之…

2026/7/23 14:30:58 阅读更多 →
无人机视角下微小目标检测的YOLOv8优化实战

无人机视角下微小目标检测的YOLOv8优化实战

1. 项目背景与挑战解析无人机视角下的微小目标检测是当前计算机视觉领域最具挑战性的任务之一。在农业监测、电力巡检、安防监控等实际场景中,我们需要从高空拍摄的画面中识别出仅有几十个像素大小的目标(如输电线上的绝缘子缺陷、农田中的病虫害区域等&…

2026/7/23 14:29:58 阅读更多 →

日新闻

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

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

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

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
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:01:26 阅读更多 →

周新闻

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

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

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

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

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

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

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

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

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

2026/7/22 12:54:44 阅读更多 →

月新闻