Ожидание завершения всех запущенных горутин

Показанная программа уже корректно ждёт все десять горутин: 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 внутрь горутины не нужно.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее