Строка 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, а не после запуска. Для чисел по возрастанию нужна дополнительная координация либо последовательная печать.