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
AIdan javob
Bu kodda, gorutinlar va ko'rsatkichlar bilan ishlashda sikl yopilishining klassik xatosi mavjud.
Sikl ichidagi i o'zgaradi va nums bo'lakchasiga bir xil i ko'rsatkichlari qo'shiladi. Natijada, nums elementlari hammasi bir xil xotira joyiga ishora qiladi, va sikl tugagach, bu joy 9 qiymatini saqlaydi.
Gorutinlar ishga tushirilganda, ular hammasi bir xil qiymatni chiqaradi — v ko'rsatadigan manzil barcha elementlar uchun bir xil bo'ladi.
Buni tuzatish uchun, sikl ichida yangi o'zgaruvchi yaratish kerak, shunda har bir ko'rsatkich alohida qiymatga ishora qiladi:
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)
}
}
Bu yerda, sikl ichida val yaratamiz va v ni anonim funktsiyaga parametr sifatida uzatamiz, bu esa qiymatni to'g'ri ushlashni ta'minlaydi.