> Почему вывод в цикле с горутинами в Go не гарантирован по порядку (Go)

Уровень: senior · Роль: backend · Категория: Технические вопросы

Компании: Т-Банк

Стек: Go

> Пример ответа

Вывод в цикле с горутинами не гарантирован по порядку из-за конкурентного выполнения горутин и отсутствия синхронизации. Когда вы запускаете несколько горутин в цикле, Go scheduler (планировщик) распределяет их выполнение между доступными потоками ОС, и порядок их запуска, выполнения и завершения недетерминирован. Каждая горутина может начать выполнение в произвольный момент времени, а вывод в stdout (через fmt.Println) - это блокирующая операция, которая также может быть перемешана из-за планирования.

Кроме того, распространённая ошибка - захват переменной цикла по ссылке (например, for i := 0; i < n; i++ { go func() { fmt.Println(i) }() }), что приводит к тому, что все горутины видят последнее значение i к моменту своего выполнения, а не то, которое было на момент создания. Это усугубляет неопределённость порядка. Для гарантии порядка необходимо использовать синхронизацию (например, каналы, мьютексы или WaitGroup) и передавать значение в горутину как аргумент.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью