Мьютекс или канал: что выбрать
Девиз Go гласит: не общайтесь через разделяемую память, а разделяйте память через общение. Но это не значит, что мьютексы под запретом — у каждого инструмента своя ниша.
Когда канал
- Передача владения данными от одной горутины к другой.
- Оркестрация: сигналы, события, пайплайны.
- Когда логика естественно описывается как поток сообщений.
Когда мьютекс
- Защита простого разделяемого состояния — счётчик, кэш, мапа.
- Когда канал добавил бы лишнюю сложность без пользы.
type Counter struct {
mu sync.Mutex
n int
}
func (c *Counter) Inc() {
c.mu.Lock(); c.n++; c.mu.Unlock()
}Для защиты одного счётчика мьютекс явно проще канала. Не усложняйте ради красивого лозунга.