Sobes.tech
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:

  1. Erro de digitação no parâmetro da função: sync.WaitGrop em vez de sync.WaitGroup.
  2. No ciclo for i := 0; i < 10; i++ é chamado wg.Add(8), mas são lançadas 10 goroutines — isso levará a um deadlock, pois wg.Done() será chamado 10 vezes, mas a espera é apenas por 8.
  3. A passagem da variável i para o closure está correta, pois i é 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".