标准答案
- WaitGroup 适合只关心全部完成的简单协作,但错误和取消需要另行实现。
- errgroup.WithContext 在一个任务出错后取消其他任务,调用 Wait 返回错误。
- 任务必须正确响应 context,否则取消只能停留在信号层。
- 如果部分任务允许独立失败,应显式收集每个结果而不是无条件用第一个错误终止。
题目解析
WaitGroup 只提供计数等待,错误、取消和结果要另行实现;errgroup.WithContext 将第一个错误传播给 Wait,并取消共享 context,适合一组任务共同成功或失败的场景。
取消只是协作信号,任务必须监听 ctx 并从阻塞调用返回。部分任务允许独立失败时,应收集每个结果,不要无条件用第一个错误掩盖其他信息。
结果发送也必须可取消,避免消费者因一个任务失败退出后,其他 goroutine 永久堵在 channel 上。
常见误区
- 误区:errgroup 取消 context 就代表 goroutine 已退出。改正:任务必须监听取消并等待 errgroup.Wait 完成。
- 误区:第一个错误掩盖其他结果。改正:按全败/部分成功语义收集、记录和展示其他任务状态。
- 误区:任务向已取消的结果 channel 发送。改正:发送时同时选择 ctx.Done,并由 owner 关闭 channel。