Что такое WaitGroup в Go

Ответ

WaitGroup в Go — это механизм синхронизации из пакета sync, который позволяет дождаться завершения группы горутин.

Основные методы:

  • Add(delta int) — увеличивает счетчик на delta (обычно на 1 при запуске горутины).
  • Done() — уменьшает счетчик на 1 (вызывается в конце горутины).
  • Wait() — блокирует выполнение, пока счетчик не станет 0.

Пример:

package main

import (
    "fmt"
    "sync"
    "time"
)

func worker(id int, wg *sync.WaitGroup) {
    defer wg.Done() // Уменьшаем счетчик по завершении горутины
    fmt.Printf("Горутина %d начала работуn", id)
    time.Sleep(time.Second) // Имитация работы
    fmt.Printf("Горутина %d завершила работуn", id)
}

func main() {
    var wg sync.WaitGroup

    for i := 1; i <= 3; i++ {
        wg.Add(1) // Увеличиваем счетчик перед запуском каждой горутины
        go worker(i, &wg)
    }

    wg.Wait() // Ждем, пока счетчик не станет 0 (все горутины завершатся)
    fmt.Println("Все горутины завершили выполнение.")
}

⚠️ Важно:

  • Add() нужно вызывать до запуска горутины, чтобы счетчик был корректно установлен до того, как Wait() начнет проверять его значение.
  • Done() лучше вызывать через defer, чтобы гарантировать его выполнение даже при панике внутри горутины.
  • Нельзя использовать WaitGroup повторно без сброса счетчика (что обычно не требуется, так как WaitGroup создается для конкретного набора горутин).