标准答案

  1. WaitGroup 适合只关心全部完成的简单协作,但错误和取消需要另行实现。
  2. errgroup.WithContext 在一个任务出错后取消其他任务,调用 Wait 返回错误。
  3. 任务必须正确响应 context,否则取消只能停留在信号层。
  4. 如果部分任务允许独立失败,应显式收集每个结果而不是无条件用第一个错误终止。

题目解析

WaitGroup 只提供计数等待,错误、取消和结果要另行实现;errgroup.WithContext 将第一个错误传播给 Wait,并取消共享 context,适合一组任务共同成功或失败的场景。

取消只是协作信号,任务必须监听 ctx 并从阻塞调用返回。部分任务允许独立失败时,应收集每个结果,不要无条件用第一个错误掩盖其他信息。

结果发送也必须可取消,避免消费者因一个任务失败退出后,其他 goroutine 永久堵在 channel 上。

常见误区

  • 误区:errgroup 取消 context 就代表 goroutine 已退出。改正:任务必须监听取消并等待 errgroup.Wait 完成。
  • 误区:第一个错误掩盖其他结果。改正:按全败/部分成功语义收集、记录和展示其他任务状态。
  • 误区:任务向已取消的结果 channel 发送。改正:发送时同时选择 ctx.Done,并由 owner 关闭 channel。

作者信息