WaitGroup.Add Called Inside Goroutine

WaitGroup.Add called inside goroutine, causing race with Wait (govet)

Quick Answer

Call wg.Add(1) before launching the goroutine, not inside it. Otherwise the main goroutine may call Wait before Add is executed.

Why This Happens

sync.WaitGroup.Add must be called before the goroutine starts, not inside it. If Add runs concurrently with Wait, there is a race: Wait might return before Add increments the counter, causing the program to exit before all goroutines finish.

The Problem

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 5; i++ {
        go func() {
            wg.Add(1) // race with wg.Wait()
            defer wg.Done()
            doWork()
        }()
    }
    wg.Wait()
}

The Fix

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 5; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            doWork()
        }()
    }
    wg.Wait()
}

Step-by-Step Fix

  1. 1

    Identify the misplaced Add

    Find wg.Add calls that are inside the goroutine function instead of before the go statement.

  2. 2

    Move Add before go

    Place wg.Add(1) immediately before the go statement that launches the goroutine.

  3. 3

    Verify Done matches Add

    Ensure every goroutine calls wg.Done() exactly once, usually with defer.

Bugsly catches this automatically

Bugsly's AI analyzes this error pattern in real-time, explains what went wrong in plain English, and suggests the exact fix — before your users even report it.

Try Bugsly free