Ответ
Map в Go — это хэш-таблица, которая хранит пары ключ-значение. Под капотом она использует массив бакетов (buckets), каждый из которых содержит список элементов.
Ключевые моменты:
- При добавлении элемента вычисляется хэш ключа, определяющий бакет.
- Если хэши ключей совпадают (коллизия), элементы хранятся в связном списке внутри бакета.
- При росте числа элементов map автоматически ресайзится, увеличивая количество бакетов.
Пример:
m := make(map[string]int)
m["foo"] = 42 // Хэш "foo" → бакет → сохранение
val, ok := m["foo"] // Поиск по хэшу
Нюансы:
- Порядок итерации не гарантирован (рандомизован).
- Нельзя брать адрес элемента map (он может перемещаться при ресайзе).
- Нулевое значение map —
nil, попытка записи вызовет панику.