Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Golang: Go, goroutine, closure, race condition, variable capture

Как в Go передать переменную цикла в горутину без гонки данных?

Проверяет понимание захвата переменных в замыканиях горутин и способов избежать состояния гонки в Go.

Короткий ответ

В Go переменная цикла переиспользуется на каждой итерации, поэтому передача её адреса в горутину приводит к гонке данных. Решение — передавать значение как аргумент горутины или создавать локальную копию внутри цикла. Это гарантирует, что каждая горутина получит уникальное значение.

Длинный ответ

Проблема захвата переменной цикла

В Go переменная, объявленная в цикле for, переиспользуется на каждой итерации. Если запустить горутину внутри цикла и использовать эту переменную напрямую, все горутины увидят одно и то же значение — последнее присвоенное после завершения цикла. Это классическая проблема гонки данных (race condition).

Решение: передача значения как аргумента

Самый простой способ — передать переменную цикла как аргумент горутины. В Go аргументы копируются при запуске горутины, поэтому каждая получит свою копию:

for i := 0; i < 5; i++ {
    go func(val int) {
        fmt.Println(val)
    }(i)
}

Решение: локальная копия

Другой вариант — создать локальную переменную внутри цикла:

for i := 0; i < 5; i++ {
    i := i // создаём копию
    go func() {
        fmt.Println(i)
    }()
}

Это работает, потому что на каждой итерации создаётся новая переменная i.

Вывод

Используйте передачу аргумента или локальную копию, чтобы избежать гонки данных при работе с горутинами в циклах. Это обязательная практика для безопасного конкурентного кода в Go.

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    5

  • Сложность:

    4

Навыки

  • Golang

    Golang

Ключевые слова

#Go

#goroutine

#closure

#race condition

#variable capture

Подпишись на Golang Developer в телеграм

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.