Есть ли у `map` в Go понятие `capacity`, как у слайсов?

Ответ

Нет, в отличие от слайсов, у map в Go нет явного свойства capacity, которое можно было бы прочитать с помощью функции cap().

Однако при создании map с помощью make можно передать второй, необязательный, аргумент, который служит подсказкой о размере (size hint). Это не жесткое ограничение, а рекомендация для первоначального выделения памяти.

// Создание map с подсказкой, что в ней будет около 100 элементов
m := make(map[string]int, 100)

Зачем это нужно?


  1. Оптимизация производительности: Внутри Go map реализована как хеш-таблица. Когда количество элементов превышает определенный порог (load factor), происходит дорогостоящая операция: выделяется новая, большая хеш-таблица, и все существующие элементы переносятся в нее (re-hashing).



  2. Предотвращение лишних аллокаций: Если вы заранее знаете примерное количество элементов, которые будут храниться в map, указание size hint позволяет Go сразу выделить достаточно памяти. Это помогает избежать или сократить количество переаллокаций и перехеширований по мере добавления элементов, что делает вставку более быстрой.


Итог: Хотя у map нет capacity в том же смысле, что у слайса, механизм size hint в make выполняет схожую функцию — оптимизирует выделение памяти для повышения производительности.