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

AIден жооп

Бул коддо, горутиналар жана көрсөткүчтөр менен иштөөдө циклде жабылуу ката бар.

Циклдеги i өзгөрмө өзгөрүп турат, жана nums бөлүгүнө бирдей i өзгөрмөсүнө көрсөткүчтөр кошулат. Натыйжада, бардык nums элементтери бир эле эс тутум жайына көрсөтүп турат, жана цикл аяктагандан кийин бул жай 9 маанисин сактайт.

Горутиналар ишке киргизилгени менен, алар бардык бирдей маанини чыгарат — v көрсөтүп турган дарек бардык элементтер үчүн бирдей болот.

Бул маселени оңдоо үчүн, цикл ичинде жаңы өзгөрмө түзүү керек, ошондо ар бир көрсөткүч бөлөк мааниге көрсөтөт:

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

Мында биз цикл ичинде val түзөбүз жана v-ни анонимдуу функцияга параметр катары өткөрөбүз, бул туура маанини кармоону камсыздайт.