Ответ
При эвакуации (rehashing) в мапе Go количество бакетов увеличивается в 2 раза. Это происходит, когда средняя нагрузка на бакет превышает 6.5 элементов (load factor). Процесс включает:
- Создание нового массива бакетов в 2 раза больше
- Постепенная миграция данных из старых бакетов в новые
- Использование инкрементального подхода - при каждом обращении к мапе мигрирует по 1 бакету
Пример:
m := make(map[int]string)
for i := 0; i < 100; i++ {
m[i] = fmt.Sprintf("value%d", i) // При достижении порога произойдет rehash
}
Особенности:
- Операция не блокирующая (concurrent-safe)
- Старые бакеты остаются доступными до полной миграции
- Хэш-функция использует младшие биты для определения бакета