Как устроена map в Go и какие у неё особенности?
- Почему порядок обхода 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 минут бесплатно.