> Как передача мьютекса по значению влияет на защиту от гонок в Go? (Go)

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

Компании: Ютека

Стек: Go

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

В Go мьютекс (sync.Mutex) должен передаваться только по указателю (*sync.Mutex). Передача мьютекса по значению создаёт копию мьютекса, что полностью разрушает защиту от гонок данных. Причина в том, что копия мьютекса - это отдельный объект, не связанный с оригиналом. Если две горутины блокируют разные копии, они не синхронизируются друг с другом, и доступ к общим данным остаётся неконтролируемым.

Пример опасного кода:

GO
func process(data *int, mu sync.Mutex) { // передача по значению
mu.Lock()
*data++
mu.Unlock()
}

Здесь каждая горутина получит свою копию mu, и data будет изменяться без взаимного исключения.

Правильный способ - передавать указатель:

GO
func process(data *int, mu *sync.Mutex) {
mu.Lock()
*data++
mu.Unlock()
}

Также стоит отметить, что структуры, содержащие мьютекс (например, пул соединений), должны передаваться по указателю, чтобы мьютекс оставался общим. Встроенный анализатор Go (go vet) предупредит о передаче мьютекса по значению.

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

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