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.