Проверяет понимание внутреннего устройства хеш-таблицы (map) в Go, в частности структуры и вместимости бакета.
В реализации map в Go данные хранятся в массиве бакетов. Каждый бакет — это фиксированная структура, которая может содержать до 8 пар ключ-значение. Ключи и значения хранятся отдельными массивами внутри бакета для улучшения кэш-локальности.
Бакет вмещает ровно 8 элементов. Это число выбрано как компромисс между производительностью и использованием памяти. Если в один бакет попадает более 8 ключей (из-за коллизий хеша), Go создаёт дополнительный бакет (overflow bucket) и связывает его с текущим через указатель. Такие цепочки могут быть длинными, но при росте map Go перестраивает хеш-таблицу, увеличивая количество бакетов.
package main
import "fmt"
func main() {
m := make(map[int]string)
// Добавляем 9 элементов с одинаковыми младшими битами хеша
for i := 0; i < 9; i++ {
m[i*8] = fmt.Sprintf("val%d", i)
}
fmt.Println(len(m)) // 9
// Внутренне: один бакет с 8 элементами + overflow бакет с 1 элементом
}Понимание бакетов помогает оптимизировать использование map в Go, особенно при работе с большими объёмами данных, где коллизии могут снижать производительность. Выбор 8 элементов на бакет обеспечивает баланс между скоростью доступа и компактностью хранения.