Ответ
- Неоптимальный размер при инициализации
Еслиmapсоздаётся без указания размера (make(map[K]V)), возможны частые рехеширования при добавлении элементов. Лучше указывать примерный размер:
m := make(map[int]string, 1000) // Предварительное выделение памяти
-
Использование сложных ключей
Ключи с медленнымиhash/equals(например, структуры с вложеннымиmap) замедляют операции. Оптимально — простые типы (int,string). -
Конкуренция при записи
Без синхронизации (sync.Mutex,sync.RWMutex) параллельная запись вызывает панику. Для конкурентного доступа используйтеsync.Map(если reads >> writes). -
Частые аллокации памяти
Динамическое изменение размераmapтребует перераспределения памяти. Если возможно, заранее резервируйте место. -
Утечки памяти
Удаление элементов (delete(m, key)) не всегда возвращает память. Иногда помогает создание новойmapи копирование данных.
Пример медленного ключа:
type BadKey struct {
data map[int]int // Хеширование такой структуры будет медленным
}