Гарантированного полного вывода нет: 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; для фиксированного порядка используйте отдельную координацию либо обычный цикл.