Вопрос с собеседования · Go

Как устроена 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 — быстрее и экономнее по памяти

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

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

Подробно

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.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Хеш-таблица с O(1) и случайным порядком обхода; запись не потокобезопасна
  • ✗Порядок обхода стабилен и совпадает с порядком вставки
  • ✗Конкурентная запись в map из горутин безопасна
  • ✗В nil-map можно писать

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования