WaitGroup 用于等待一组 goroutine 完成:Add(n) 增加计数,每个 goroutine 结束时 Done()(即 Add(-1)),等待方 Wait() 阻塞到计数归零。铁律:Add 必须在启动 goroutine 之前、由发起方在同一个 goroutine 里调用,保证 Add 先于 Wait 发生;Done 一般用 defer 保证执行。
var wg sync.WaitGroup
for i := 0; i < n; i++ {
wg.Add(1) // 先 Add
go func(id int) {
defer wg.Done() // 保证 Done
process(id)
}(i)
}
wg.Wait()
常见错误:把 Add(1) 写在 goroutine 内部,与 Wait 竞争导致提前返回甚至 panic;Add 负数使计数变负直接 panic;WaitGroup 计数归零后可复用,但与仍在 Wait 的并发调用混用有风险;把 WaitGroup 值拷贝传递导致副本计数无效。
Go 1.25 起提供 wg.Go(func) 方法,自动封装 Add/Done,进一步减少出错面。超出'等待结束'的复杂编排(错误传播、取消、并发上限)应改用 golang.org/x/sync/errgroup。追问方向:errgroup 的实现原理、WaitGroup 与 channel 屏障的对比。