Как изменится вывод при запуске горутин внутри цикла

Могут быть напечатаны некоторые числа от 0 до 4999 в произвольном порядке; полный набор не гарантирован, потому что main не ждёт горутины. Разделителей между числами тоже нет.

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

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

Могут быть напечатаны некоторые числа от 0 до 4999 в произвольном порядке; полный набор не гарантирован, потому что main не ждёт горутины. Разделителей между числами тоже нет.

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

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

Условие

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

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

Ответ

Могут быть напечатаны некоторые числа от 0 до 4999 в произвольном порядке; полный набор не гарантирован, потому что main не ждёт горутины. Разделителей между числами тоже нет.

Аргумент fmt.Print(idx) вычисляется при запуске go-выражения, поэтому проблемы захвата общей переменной через замыкание здесь нет. Но выполнение вызовов асинхронно, и выход main завершает процесс. Для всех чисел нужен WaitGroup; для строгого порядка — дополнительная координация или последовательная печать.

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

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

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

Подробнее