Назад к вопросам
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.