WaitGroup Yanlış Kullanımı (ARCH5037)
Anahtar go.async.waitgroup-misuse · Önem warning · Kategori async
sync.WaitGroup yanlış kullanımı: wg.Add goroutine başlatılmadan önce değil de içinde çağrılırsa Wait ile yarış oluşur; defer wg.Done() eksikse panik durumunda Wait sonsuza kadar asılı kalır.
Hatalı
Bölüm başlığı “Hatalı”func RunAll(tasks []func()) { var wg sync.WaitGroup for _, t := range tasks { go func(fn func()) { wg.Add(1) // launch'tan sonra; Wait'i kaçırabilir fn() }(t) } wg.Wait()}func RunAll(tasks []func()) { var wg sync.WaitGroup for _, t := range tasks { wg.Add(1) go func(fn func()) { defer wg.Done() fn() }(t) } wg.Wait()}Düzeltme
Bölüm başlığı “Düzeltme”wg.Add(1)’i goroutine’i başlatmadan önce çağırın ve goroutine başında defer wg.Done() kullanın.