Показанная программа уже корректно ждёт все десять горутин: Add выполняется до запуска, Done отложен внутри каждой, а Wait вызывается после цикла.
Ожидание завершения всех запущенных горутин
Показанная программа уже корректно ждёт все десять горутин: Add выполняется до запуска, Done отложен внутри каждой, а Wait вызывается после цикла.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Измените программу так, чтобы функция main ожидала завершения всех запущенных горутин перед своим завершением.
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
printNumber(i)
}(i)
}
wg.Wait()
}
func printNumber(n int) {
time.Sleep(time.Second)
fmt.Println(n)
}
Ответ
Показанная программа уже корректно ждёт все десять горутин: Add выполняется до запуска, Done отложен внутри каждой, а Wait вызывается после цикла.
Будут выведены числа 0–9 в произвольном порядке примерно после секундного ожидания. WaitGroup гарантирует завершение, а не последовательность вывода. Передача i параметром исключает зависимость от старой семантики захвата переменной цикла. Добавлять Sleep в main или переносить Add внутрь горутины не нужно.