Получить доступ

Как устроена map в Go и какие у неё особенности?

JuniorСрезы, мапы и строки
Ещё спрашивают так:
  • Почему порядок обхода map в Go случайный?
  • Можно ли писать в map из нескольких горутин?
Коротко

map — хеш-таблица: вставка, поиск и удаление в среднем O(1). Порядок обхода случаен и намеренно перемешивается от запуска к запуску. Конкурентная запись из нескольких горутин — фатальная ошибка «concurrent map writes»: нужен Mutex или sync.Map.

  • Проверка наличия: v, ok := m[key]
  • В nil-map писать нельзя — panic; создавать через make или литерал
  • Ключ — сравнимый тип: не срез, не мапа, не функция

А ещё Go 1.24 перешёл на Swiss Tables — быстрее и экономнее по памяти

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Попробуйте сами

Хеш-таблица: цепочки и открытая адресация, коллизии, расширение

Подробно

m := map[string]int{"a": 1}
m["b"] = 2
v, ok := m["c"]      // 0, false
delete(m, "a")
for k, v := range m { ... }   // порядок не гарантирован

Случайный порядок сделан намеренно, чтобы код не опирался на детали реализации. Нужен порядок — собрать ключи, отсортировать (slices.Sorted(maps.Keys(m))) и обойти.

Конкурентность. Мапа не потокобезопасна. Рантайм обнаруживает одновременную запись и аварийно завершает программу (это не panic, его нельзя перехватить). Варианты: sync.RWMutex вокруг мапы; sync.Map — для сценариев «много чтений, ключи редко добавляются»; шардирование по нескольким мапам с отдельными мьютексами.

Элементы неадресуемы: &m["k"] не компилируется, а m["k"].Field = 1 для структурного значения — тоже; хранят указатели или перезаписывают значение целиком.

Память не возвращается после удаления элементов — большую мапу, которая опустела, пересоздают.

Что хотят услышать

  • Хеш-таблица и сложность.
  • Случайный порядок обхода.
  • Потокобезопасность и решения.
  • Проверка наличия через ok.

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем