Sobes.tech
Back to questions
Senior
3

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

Companies where asked
CRTEX

Answer from AI

sobes.tech 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 как параметр в анонимную функцию, что гарантирует корректное захватывание значения.