Запуск горутин в цикле и захват переменных

Гарантированного полного вывода нет: main не ждёт запущенные горутины. Успевшие вызовы могут напечатать разные значения 0–4999 в произвольном порядке.

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

Что ответить на собеседовании

Гарантированного полного вывода нет: main не ждёт запущенные горутины. Успевшие вызовы могут напечатать разные значения 0–4999 в произвольном порядке.

Подробный разбор

Ответ с пояснениями

Условие

Определите, какой вывод будет получен при выполнении следующей программы:

func main() {
    limit := 5000
    for i := 0; i < limit; i++ {
        go fmt.Println(i)
    }
}

Ответ

Гарантированного полного вывода нет: main не ждёт запущенные горутины. Успевшие вызовы могут напечатать разные значения 0–4999 в произвольном порядке.

Здесь нет замыкания, читающего переменную i позднее: аргумент fmt.Println(i) вычисляется при go-вызове. Проблема в жизненном цикле и порядке выполнения, а не захвате i. Для вывода всех чисел добавьте WaitGroup; для фиксированного порядка используйте отдельную координацию либо обычный цикл.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее