Senior
```go func main() { wg := sync.WaitGroup{} wg.Add(8) for i := 0; i < 10; i++ { go func(wg *sync.WaitGroup, i int) { defer wg.Done() fmt.Println(i) }(&wg,i) } wg.Wait() fmt.Println("some text") time.Sleep(1 * time.Minute) fmt.Println("some text2") } ```
sobes.tech IA
Resposta da IA
No código apresentado, há vários erros e problemas potenciais:
- Erro de digitação no parâmetro da função:
sync.WaitGropem vez desync.WaitGroup. - No ciclo
for i := 0; i < 10; i++é chamadowg.Add(8), mas são lançadas 10 goroutines — isso levará a um deadlock, poiswg.Done()será chamado 10 vezes, mas a espera é apenas por 8. - A passagem da variável
ipara o closure está correta, poisié passado como parâmetro, o que previne o erro clássico com closures em loops.
Exemplo corrigido:
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
wg.Add(10) // O número de goroutines deve corresponder ao Add
for i := 0; i < 10; i++ {
go func(wg *sync.WaitGroup, i int) {
defer wg.Done()
fmt.Println(i)
}(&wg, i)
}
wg.Wait()
fmt.Println("some text")
time.Sleep(1 * time.Minute)
fmt.Println("some text2")
}
Dessa forma, o código cria corretamente 10 goroutines, cada uma exibindo seu valor de i, e o thread principal espera todas terminarem, imprime "some text", espera um minuto e depois imprime "some text2".