Sobes.tech
Junior

Para que é que o WaitGroup é utilizado em Go?

sobes.tech IA

Resposta da IA

WaitGroup é utilizado para sincronizar o trabalho de uma ou várias goroutines. Permite que a goroutine principal aguarde a conclusão de outras goroutines criadas. Consiste num contador que aumenta quando uma goroutine é criada e diminui quando ela termina.

Métodos principais:

  • Add(delta int): Aumenta ou diminui o contador de goroutines.
  • Done(): Diminui o contador em 1. Geralmente chamado ao final de uma goroutine (frequentemente com defer).
  • Wait(): Bloqueia a execução até que o contador seja zero.

Exemplo de uso:

package main

import (
	"fmt"
	"sync"
)

func worker(id int, wg *sync.WaitGroup) {
	defer wg.Done() // Diminui o contador ao terminar a goroutine

	fmt.Printf("Goroutine %d começa\n", id)
	// Simulação de trabalho
	// time.Sleep(time.Second)
	fmt.Printf("Goroutine %d termina\n", id)
}

func main() {
	var wg sync.WaitGroup // Cria um WaitGroup

	for i := 1; i <= 5; i++ {
		wg.Add(1) // Incrementa o contador para cada goroutine
		go worker(i, &wg) // Inicia a goroutine, passando o ponteiro do WaitGroup
	}

	wg.Wait() // Aguarda até que o contador seja zero (todas as goroutines terminem)
	fmt.Println("Todas as goroutines terminaram")
}