Получить доступ

Когда использовать каналы, а когда sync.Mutex и WaitGroup?

JuniorГорутины и каналы
Ещё спрашивают так:
  • Чем Mutex отличается от RWMutex?
  • Как дождаться завершения нескольких горутин?
Коротко

Каналы — для передачи данных и владения ими между горутинами (конвейеры, очереди задач). Mutex — для защиты общего состояния (кэш, счётчик). WaitGroup — дождаться группы горутин. RWMutex — много читателей одновременно или один писатель.

  • wg.Add до запуска горутины, defer wg.Done() внутри
  • Мьютекс не копировать — передавать структуру по указателю
  • sync.Once — однократная инициализация; atomic — простые счётчики

А ещё errgroup.Group — WaitGroup с первой ошибкой и отменой контекста

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Правило выбора. Если данные передаются от одной горутины другой — канал. Если несколько горутин разделяют структуру — мьютекс: канал ради защиты карты получается сложнее и медленнее.

WaitGroup: Add(n) до запуска, Done() в каждой горутине (через defer), Wait() блокируется до нуля. Ошибка — Add внутри горутины: Wait может вернуться раньше. В Go 1.25 появился wg.Go(f).

errgroup (golang.org/x/sync) — запускает горутины, ждёт всех и возвращает первую ошибку; с WithContext отменяет остальных.

Атомики (sync/atomic, типы atomic.Int64) — для счётчиков и флагов без мьютекса.

Пример

type Cache struct {
    mu sync.RWMutex
    m  map[string]string
}
func (c *Cache) Get(k string) (string, bool) {
    c.mu.RLock(); defer c.mu.RUnlock()
    v, ok := c.m[k]; return v, ok
}

var wg sync.WaitGroup
for _, url := range urls {
    wg.Add(1)
    go func() { defer wg.Done(); fetch(url) }()
}
wg.Wait()

Что хотят услышать

  • Критерий: передача данных или общее состояние.
  • Правильное использование WaitGroup.
  • RWMutex, Once, errgroup.

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем