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

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.