> Что будет если мьютекс передается по значению в Go? (Go)
Уровень: senior · Роль: backend · Категория: Технические вопросы
Компании: Ютека
Стек: Go
> Пример ответа
Передача мьютекса по значению в Go приводит к копированию его внутреннего состояния. Поскольку sync.Mutex - это структура, содержащая счетчик ожидающих горутин и флаг блокировки, копия не будет синхронизирована с оригиналом. Это означает, что блокировка, захваченная на одной копии, не будет видна другой, что приводит к гонкам данных (data race) и неопределенному поведению. Например:
GOfunc doWork(mu sync.Mutex) { // передача по значениюmu.Lock()defer mu.Unlock()// критическая секция}func main() {var mu sync.Mutexgo doWork(mu) // копия мьютексаmu.Lock() // оригинал не заблокирован// ...}
В этом коде обе горутины могут одновременно войти в критическую секцию, так как работают с разными копиями мьютекса. Правильный подход - передавать мьютекс по указателю (*sync.Mutex) или использовать его как поле структуры, передаваемой по ссылке. Go-тулчейн (например, go vet) предупредит о такой ошибке, но полагаться только на это не стоит.
> Похожие задачи по backend
Почему Go хорошо работает с асинхронными задачами?
Как передача мьютекса по значению влияет на защиту от гонок в Go?
Зачем нужны указатели в структуре с мапой и мьютексом в Go, если мапа является ссылочным типом
Какие типы являются ссылочными в Go
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью