Используйте sync.WaitGroup: Add выполняется до запуска, каждая goroutine вызывает Done через defer, main ждёт Wait. Это гарантирует завершение, но не порядок чисел.
Как дождаться вывода пяти goroutines
Используйте sync.WaitGroup: Add выполняется до запуска, каждая goroutine вызывает Done через defer, main ждёт Wait. Это гарантирует завершение, но не порядок чисел.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Программа Go запускает пять goroutines, каждая печатает число, и сразу выходит из main. Как гарантировать завершение всех без time.Sleep?
Ответ
Используйте sync.WaitGroup: Add выполняется до запуска, каждая goroutine вызывает Done через defer, main ждёт Wait. Это гарантирует завершение, но не порядок чисел.
Пример:
var wg sync.WaitGroup
for i := 1; i <= 5; i++ {
wg.Add(1)
go func(value int) {
defer wg.Done()
fmt.Println(value)
}(i)
}
wg.Wait()
Нужны fmt и sync. Явная передача i исключает зависимость примера от исторических различий семантики переменной цикла.