> Почему вывод в цикле с горутинами в Go не гарантирован по порядку (Go)
Уровень: senior · Роль: backend · Категория: Технические вопросы
Компании: Т-Банк
Стек: Go
> Пример ответа
Вывод в цикле с горутинами не гарантирован по порядку из-за конкурентного выполнения горутин и отсутствия синхронизации. Когда вы запускаете несколько горутин в цикле, Go scheduler (планировщик) распределяет их выполнение между доступными потоками ОС, и порядок их запуска, выполнения и завершения недетерминирован. Каждая горутина может начать выполнение в произвольный момент времени, а вывод в stdout (через fmt.Println) - это блокирующая операция, которая также может быть перемешана из-за планирования.
Кроме того, распространённая ошибка - захват переменной цикла по ссылке (например, for i := 0; i < n; i++ { go func() { fmt.Println(i) }() }), что приводит к тому, что все горутины видят последнее значение i к моменту своего выполнения, а не то, которое было на момент создания. Это усугубляет неопределённость порядка. Для гарантии порядка необходимо использовать синхронизацию (например, каналы, мьютексы или WaitGroup) и передавать значение в горутину как аргумент.
> Похожие задачи по backend
Что такое rune в Go
Почему в Go нет гарантии порядка выполнения горутин
В чем отличие планировщика Go от планировщика операционной системы
Можно ли использовать map одновременно из нескольких горутин без синхронизации
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью