Что выведет программа? Почему?

Если исправить баг с sync.WaitGroup, передавать указатель на wg вместо копии, то программа корректно дождётся завершения всех горутин перед выходом.

Короткий ответ

Что ответить на собеседовании

Если исправить баг с sync.WaitGroup, передавать указатель на wg вместо копии, то программа корректно дождётся завершения всех горутин перед выходом.

Подробный разбор

Ответ с пояснениями

Условие

Что выведет программа? Почему?

func main() { timeStart := time.Now() _, _ = <-worker(), <-worker() println(int(time.Since(timeStart).Seconds())) }

func worker() chan int { ch := make(chan int) go func() { time.Sleep(3 * time.Second) ch <- 1 }() return ch }

Ответ

Если исправить баг с sync.WaitGroup, передавать указатель на wg вместо копии, то программа корректно дождётся завершения всех горутин перед выходом.

Без передачи указателя каждая горутина работает с копией WaitGroup, и вызовы Done() не уменьшают счётчик в оригинальном wg. В итоге main может завершиться раньше, чем горутины.

После исправления на экране мы увидим ожидаемый вывод всех горутин, например:

var wg sync.WaitGroup
wg.Add(2)

go func(wg *sync.WaitGroup) {
    defer wg.Done()
    fmt.Println("Горутина 1 завершена")
}(&wg)

go func(wg *sync.WaitGroup) {
    defer wg.Done()
    fmt.Println("Горутина 2 завершена")
}(&wg)

wg.Wait()
fmt.Println("Все горутины завершены")

Вывод будет:

Горутина 1 завершена
Горутина 2 завершена
Все горутины завершены

Это означает, что main дождался завершения всех горутин.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку