Если исправить баг с 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 дождался завершения всех горутин.