> Почему в Go нельзя взять значение по ссылке из мапы (Go)

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

Компании: Avito

Стек: Go

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

В Go нельзя взять адрес элемента мапы (например, &m[key]), потому что мапа в Go - это хеш-таблица с динамическим изменением размера. Когда мапа растёт или перестраивается (rehash), все существующие значения физически перемещаются в новую область памяти. Если бы мы могли получить указатель на элемент, он бы стал невалидным после реаллокации, что нарушает гарантии безопасности памяти в Go.

Кроме того, мапа не гарантирует фиксированного расположения элементов в памяти - порядок обхода может меняться, и внутренняя структура может перестраиваться при добавлении/удалении ключей. Указатель на элемент мапы мог бы указывать на "мусор" после таких операций.

Вместо этого Go предлагает два подхода:

  1. Копировать значение из мапы: val := m[key] - это безопасно, так как возвращается копия.
  2. Хранить в мапе указатели: m[key] = &someStruct - тогда вы работаете с указателем на внешний объект, который не перемещается мапой.

Таким образом, запрет на взятие адреса элемента мапы - это осознанное проектное решение для предотвращения висячих указателей и обеспечения безопасности памяти.

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

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