Как происходит увеличение количества Bucket в случае эвакуации

«Как происходит увеличение количества Bucket в случае эвакуации» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

При эвакуации (rehashing) в мапе Go количество бакетов увеличивается в 2 раза. Это происходит, когда средняя нагрузка на бакет превышает 6.5 элементов (load factor). Процесс включает:

  1. Создание нового массива бакетов в 2 раза больше
  2. Постепенная миграция данных из старых бакетов в новые
  3. Использование инкрементального подхода - при каждом обращении к мапе мигрирует по 1 бакету

Пример:

m := make(map[int]string)
for i := 0; i < 100; i++ {
    m[i] = fmt.Sprintf("value%d", i) // При достижении порога произойдет rehash
}

Особенности:

  • Операция не блокирующая (concurrent-safe)
  • Старые бакеты остаются доступными до полной миграции
  • Хэш-функция использует младшие биты для определения бакета