You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否将sync.WaitGroup用于普通函数而非仅配合goroutine使用?

关于sync.WaitGroup在普通函数中使用的合法性说明

这种用法完全符合Go标准库sync包的设计规范,不存在违规问题。

核心逻辑说明

sync.WaitGroup的本质是一个计数器,设计目标是等待一组任意操作执行完成,官方从来没有限制这组操作必须由goroutine执行,只是绝大多数使用场景下,大家会用它来等待多个goroutine的执行结束,才会给人留下「只能配合goroutine使用」的误解。

你的代码逻辑验证

你给出的示例代码逻辑完全自洽,只要满足两个前提就永远不会出问题:

  • 所有m.create()的调用,都发生在m.close()调用之前,不会出现已经调用Wait之后才执行Add的情况
  • 你用了defer m.wg.Done()的写法,已经完美规避了函数异常中断导致Done未调用的问题

额外注意点

  • 后续如果需要把create()内的逻辑改成异步goroutine执行,现有WaitGroup的调用逻辑不需要做任何调整,扩展性很强
  • 唯一要避开的坑是:如果后续create()内部启动了goroutine,千万不要把wg.Add(1)写到goroutine内部,否则会有概率出现Wait已经开始执行、Add还没调用的问题,导致等待提前结束。你现在把Add写在create()入口的写法,完全不会触发这个问题。

内容的提问来源于stack exchange,提问作者Avinash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 21:39:04