> Почему для закрытия канала и ожидания работы горутин используется отдельная горутина, а не main функция? (Go)

Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Aston

Стек: Go

> Пример ответа

В Go main-функция выполняется в главной горутине. Если мы закроем канал или будем ожидать завершения горутин прямо в main, то при блокирующих операциях (например, wg.Wait() или закрытие канала после отправки) программа может зависнуть или завершиться раньше времени. Использование отдельной горутины для этих целей позволяет:

  1. Избежать deadlock'а - main-горутина не блокируется на ожидании, а может сразу перейти к завершению программы после получения сигнала.
  2. Обеспечить корректный порядок завершения - отдельная горутина закрывает канал только когда все воркеры действительно закончили работу (например, после wg.Wait()), а main-горутина в это время может обрабатывать последние данные из канала.
  3. Разделить ответственность - main отвечает за запуск и координацию, а отдельная горутина - за синхронизацию завершения.

Пример:

GO
func main() {
ch := make(chan int)
var wg sync.WaitGroup
for i := 0; i < 5; i++ {
wg.Add(1)
go func() {
defer wg.Done()
ch <- 42
}()
}
go func() {
wg.Wait()
close(ch) // закрываем канал только после всех воркеров
}()
for val := range ch {
fmt.Println(val)
}
}

Без отдельной горутины пришлось бы вызывать wg.Wait() до закрытия канала, что заблокировало бы main и не позволило бы читать из канала конкурентно.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью