> Как послать сигнал в канал, чтобы все горутины получили уведомление о завершении работы в Go (Go)

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

Компании: ЦУМ

Стек: Go

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

В Go для оповещения всех горутин о завершении работы используется закрытие канала (close(ch)). Когда канал закрывается, все горутины, ожидающие чтения из него, немедленно получают нулевое значение. Это единственный способ разослать сигнал всем слушателям одновременно.

Пример реализации:

GO
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, done <-chan struct{}, wg *sync.WaitGroup) {
defer wg.Done()
for {
select {
case <-done:
fmt.Printf("Worker %d завершает работу\n", id)
return
default:
// Имитация работы
fmt.Printf("Worker %d работает...\n", id)
time.Sleep(500 * time.Millisecond)
}
}
}
func main() {
done := make(chan struct{})
var wg sync.WaitGroup
// Запуск 3 горутин
for i := 1; i <= 3; i++ {
wg.Add(1)
go worker(i, done, &wg)
}
// Даем поработать 2 секунды
time.Sleep(2 * time.Second)
// Закрытие канала - сигнал всем горутинам
close(done)
// Ожидание завершения всех горутин
wg.Wait()
fmt.Println("Все горутины завершены")
}

Ключевые моменты:

  • Используется канал с пустой структурой (chan struct{}) для минимального потребления памяти.
  • Закрытие канала через close(done) - это broadcast-сигнал.
  • Горутины проверяют сигнал через select с case <-done.
  • sync.WaitGroup гарантирует, что main дождется завершения всех горутин.

Этот паттерн является идиоматичным для Go и эффективно решает задачу оповещения множества горутин.

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

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