Sobes.tech
Back to questions
Middle+
3

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

Companies where asked
МВидео/эльдорадо

Answer from AI

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.