Como esperar todas as goroutines terminarem em Go sem usar time.Sleep?
Olá a todos! Comecei a estudar Go e me deparei com um problema de sincronização de goroutines. Estou escrevendo um programa simples que inicia várias goroutines para processamento paralelo de dados, mas não consigo fazer a função principal esperar por elas.
Aqui está meu código:
```go
package main
import (
"fmt"
"time"
)
func worker(id int) {
fmt.Printf("Worker %d started\n", id)
time.Sleep(2 * time.Second) // simulação de trabalho
fmt.Printf("Worker %d finished\n", id)
}
func main() {
for i := 1; i <= 5; i++ {
go worker(i)
}
// O programa termina imediatamente, sem esperar as goroutines
fmt.Println("Main function ended")
}
```
O problema é que o programa termina instantaneamente, sem esperar a execução das goroutines. Eu sei que posso usar `time.Sleep()`, mas isso é uma gambiarra — não sei o tempo exato de execução de cada goroutine. Além disso, não é confiável nem eficiente.
Como sincronizar goroutines corretamente em Go? Preciso de uma solução robusta sem hardcode.