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
Atsakymas iš AI
Šiame kode yra klasikinė uždarymo klaida cikle, dirbant su gorutinomis ir rodyklėmis.
Cikle kintamasis i keičiasi, ir į nums sąrašą pridedami rodyklės į tą pačią i kintamąjį. Galutiniame rezultate visi nums elementai rodo į tą patį atminties vietą, kuri po ciklo pabaigos turi reikšmę 9.
Kuriant gorutinas, jos visos spausdins tą pačią reikšmę — v rodyklės adresas bus tas pats visiems elementams.
Norint tai ištaisyti, ciklo viduje reikia sukurti naują kintamąjį, kad kiekvienas rodyklė rodytų į atskirą reikšmę:
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)
}
}
Čia mes sukuriame val ciklo viduje ir perduodame v kaip parametrą anoniminei funkcijai, kas užtikrina teisingą reikšmės užfiksavimą.