Sobes.tech
Назад к вопросам
Middle+
2

Что выведет код с горутинами и замыканием переменной city в цикле? Как исправить?

Компании, где спрашивали
МВидео/эльдорадо

Ответ от нейросети

sobes.tech AI

При использовании горутин в цикле с замыканием переменной, например:

cities := []string{"Moscow", "London", "Paris"}
for _, city := range cities {
    go func() {
        fmt.Println(city)
    }()
}

все горутины могут вывести одно и то же значение — последнее значение переменной city из цикла. Это происходит потому, что замыкание захватывает переменную city по ссылке, а не её текущее значение на каждой итерации.

Чтобы исправить это, нужно передавать переменную как параметр анонимной функции, тем самым фиксируя её значение для каждой горутины:

for _, city := range cities {
    city := city // локальная копия
    go func(c string) {
        fmt.Println(c)
    }(city)
}

Или сразу передать параметр:

for _, city := range cities {
    go func(c string) {
        fmt.Println(c)
    }(city)
}

Так каждая горутина будет работать с собственной копией значения city.