> Какие способы общения между goroutine существуют в Go (Go)

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

Компании: InDrive

Стек: Go

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

В Go общение между горутинами строится на принципе: "Не общайтесь через разделяемую память, а разделяйте память через общение". Основные способы:

  1. Каналы (channels) - основной и рекомендуемый способ. Каналы бывают небуферизированные (синхронные) и буферизированные (асинхронные). Используются для передачи данных и сигналов. Пример:

    GO
    ch := make(chan int)
    go func() { ch <- 42 }()
    value := <-ch
  2. Select - позволяет горутине ожидать несколько каналов одновременно, обрабатывая первый готовый. Полезен для таймаутов, отмены операций и мультиплексирования.

  3. WaitGroup из пакета sync - для ожидания завершения группы горутин. Не передаёт данные, только синхронизирует.

  4. Mutex (sync.Mutex) - для защиты разделяемых данных при доступе из нескольких горутин. Используется реже, когда каналы избыточны (например, для кэша).

  5. Context (context.Context) - для отмены горутин, передачи таймаутов и значений (например, request-scoped данных). Часто комбинируется с select.

  6. Atomic операции (sync/atomic) - для простых счётчиков или флагов без блокировок.

На практике предпочтение отдаётся каналам и select, так как они встроены в модель конкурентности Go и снижают риск гонок данных. Mutex и atomic - для низкоуровневых оптимизаций, когда каналы создают излишние накладные расходы.

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

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