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 като параметър на анонимната функция, което гарантира правилното улавяне на стойността.