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 AI

Antwoord van AI

In deze code is er een klassieke sluitingsfout in de lus bij het werken met goroutines en pointers.

De variabele i in de lus verandert, en er worden pointers naar dezelfde variabele i toegevoegd aan de slice nums. Als resultaat wijzen alle elementen van nums naar dezelfde geheugenlocatie, die na het voltooien van de lus de waarde 9 bevat.

Bij het starten van de goroutines zullen ze allemaal dezelfde waarde afdrukken — het adres waar v naar wijst, zal voor alle elementen hetzelfde zijn.

Om dit te corrigeren, moet je binnen de lus een nieuwe variabele maken, zodat elke pointer naar een aparte waarde wijst:

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)
    }
}

Hier maken we val binnen de lus en geven v door als parameter aan een anonieme functie, wat een correcte capture van de waarde garandeert.