Sobes.tech
Senior

1.21 func main() { var nums []*int for i := 0; i < 10; i++ { nums = append(nums, &i) } for _, v := range nums { go func() { fmt.Println(v) }() } }

sobes.tech IA

Resposta da IA

Neste código há um erro clássico de encerramento em um ciclo ao trabalhar com goroutines e ponteiros.

A variável i no ciclo é alterada, e na fatia nums são adicionados ponteiros para a mesma variável i. Como resultado, todos os elementos de nums apontam para o mesmo local na memória, que após o ciclo conterá o valor 9.

Ao iniciar as goroutines, todas irão imprimir o mesmo valor — o endereço para o qual v aponta será o mesmo para todos os elementos.

Para corrigir, é necessário criar uma nova variável dentro do ciclo, para que cada ponteiro aponte para um valor separado:

func main() {
    var nums []*int
    for i := 0; i < 10; i++ {
        val := i
        nums = append(nums, &val)
    }

    for _, v := range nums {
        go func(v *int) {
            fmt.Println(*v)
        }(v)
    }
}

Aqui criamos val dentro do ciclo e passamos v como parâmetro para uma função anônima, o que garante uma captura correta do valor.