Как замыкание влияет на значение переменной в горутине

Строка done будет напечатана, но полный набор чисел не гарантирован: main не ждёт горутины. Их вывод может отсутствовать или перемешиваться с done.

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

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

Строка done будет напечатана, но полный набор чисел не гарантирован: main не ждёт горутины. Их вывод может отсутствовать или перемешиваться с done.

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

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

Условие

Определите, какие числа выведет программа при её выполнении.

func main() {
    for idx := 0; idx < 10; idx++ {
        go func() {
            fmt.Println(idx)
        }()
    }

    fmt.Println("done")
}

Ответ

Строка done будет напечатана, но полный набор чисел не гарантирован: main не ждёт горутины. Их вывод может отсутствовать или перемешиваться с done.

При старой семантике цикла горутины захватывают общую idx и могут видеть изменённые значения; присутствует гонка. При новой семантике объявленные переменные итераций разделены, но отсутствие ожидания остаётся.

Передайте idx параметром и добавьте WaitGroup для гарантии всех чисел 0–9. Если done должна означать завершение всех работ, печатайте её после Wait, а не после запуска. Для чисел по возрастанию нужна дополнительная координация либо последовательная печать.

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

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

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

Подробнее