WaitGroup 在 Fiber 中必须按请求新建并正确使用:每个 handler 内声明、Add 紧邻 go 前、Done 用 defer、传参隔离,否则易 panic 或 Wait 不返回;需配合 context 超时避免阻塞。

WaitGroup 在 Fiber 中不能全局复用,每个请求必须独立声明、Add 在 go 前、Done 必须 defer 且传参隔离——否则轻则 Wait 不返回,重则 panic “negative counter” 或 “reused before previous Wait has returned”。
WaitGroup 必须在 handler 内部按请求新建
Fiber 的 handler 是并发调用的,若把 sync.WaitGroup 声明在包级或中间件外,多个请求会共享同一实例。一旦前一个请求还没结束就进入下一个请求的 wg.Add(1),计数器就会错乱。
- ✅ 正确:每个
func(c *fiber.Ctx) error里用var wg sync.WaitGroup或wg := new(sync.WaitGroup) - ❌ 错误:在
main()开头定义var wg sync.WaitGroup然后所有 handler 共用 - ⚠️ 注意:
wg是值类型,传给子函数时必须传指针&wg,否则Add和Done操作的是副本
Add(1) 必须紧邻 go 语句之前
WaitGroup.Add 不是线程安全的,不能在 goroutine 内部调用;且必须确保每次 go 都对应一次 Add(1),否则 Wait() 会永远阻塞或 panic。
- ✅ 正确:
wg.Add(1); go func(u string) { defer wg.Done(); doWork(u) }(url) - ❌ 错误:
go func() { wg.Add(1); defer wg.Done(); ... }()—— Add 和 Done 不配对,且 Add 并发调用无锁保护 - ⚠️ 循环中动态启协程时,不要提前
wg.Add(len(tasks)),除非你能 100% 确保每个循环体都执行go;否则建议边遍历边Add(1)
闭包传参必须显式传值,避免循环变量捕获
Fiber handler 里常有 for _, task := range tasks 启多个 goroutine,若匿名函数直接引用 task,所有 goroutine 实际共享最后一个值。
- ✅ 正确:
for _, url := range urls { wg.Add(1); go func(u string) { defer wg.Done(); fetch(u) }(url) } - ❌ 错误:
for _, url := range urls { wg.Add(1); go func() { defer wg.Done(); fetch(url) }() }——url是循环变量,最终全为末尾值 - ⚠️ 即使加了
defer wg.Done(),若 goroutine 内 panic 未 recover,Done就不会执行 → 计数卡住 → 整个请求超时
Wait 不能超时,必须配合 context.WithTimeout 使用
sync.WaitGroup.Wait() 是纯阻塞调用,无法中断。Fiber handler 有默认超时(如 30s),但 wg.Wait() 会无视它一直卡住,直到所有 goroutine 自行结束。
- ✅ 正确:用
select+context.WithTimeout包裹wg.Wait(),例如:ctx, cancel := context.WithTimeout(c.Context(), 5*time.Second) defer cancel() done := make(chan struct{}) go func() { wg.Wait() close(done) }() select { case <-done: return c.JSON(200, fiber.Map{"status": "ok"}) case <-ctx.Done(): return c.Status(408).JSON(fiber.Map{"error": "timeout"}) } - ❌ 错误:直接写
wg.Wait()后续接c.JSON—— 一旦某个 goroutine hang 住,整个响应就卡死 - ⚠️
WaitGroup归零后不可重用;不要在同一个 handler 里多次调用wg.Wait(),会 panic
最易被忽略的一点:WaitGroup 不是“等结果”,而是“等完成”。如果你需要聚合返回值,得额外配 sync.Mutex 或 channel 收集,WaitGroup 本身不提供数据传递能力。


















