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

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

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

Стек: Go

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

Передача мьютекса по значению в Go приводит к копированию его внутреннего состояния. Поскольку sync.Mutex - это структура, содержащая счетчик ожидающих горутин и флаг блокировки, копия не будет синхронизирована с оригиналом. Это означает, что блокировка, захваченная на одной копии, не будет видна другой, что приводит к гонкам данных (data race) и неопределенному поведению. Например:

GO
func doWork(mu sync.Mutex) { // передача по значению
mu.Lock()
defer mu.Unlock()
// критическая секция
}
func main() {
var mu sync.Mutex
go doWork(mu) // копия мьютекса
mu.Lock() // оригинал не заблокирован
// ...
}

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

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

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