Map (ассоциативный массив) в Go — это встроенный тип данных, представляющий неупорядоченную коллекцию пар ключ-значение с быстрым доступом к значениям по ключу. Реализация map в Go — это хеш-таблица, оптимизированная для производительности.
Внутреннее устройство map описано в структуре hmap
(файл runtime/map.go
):
type hmap struct {
count int // текущее количество элементов в map
flags uint8 // флаги (например, флаг итерации)
B uint8 // log_2 от количества корзин (bucket)
noverflow uint16 // приблизительное количество переполненных корзин
hash0 uint32 // seed для хеш-функции
buckets unsafe.Pointer // указатель на массив корзин
oldbuckets unsafe.Pointer // указатель на старый массив корзин (для постепенного роста)
nevacuate uintptr // счетчик прогресса при эвакуации (рост map)
extra *mapextra // опциональные поля
}
2^B
.Каждая корзина (bucket) представляет собой структуру bmap
:
type bmap struct {
tophash [bucketCnt]uint8 // первые 8 бит хеша каждого ключа
// Далее следуют ключи и значения в отдельных массивах
// (компилятор генерирует код для доступа к ним)
}
В каждой корзине:
tophash
содержит первые биты хешей ключей для быстрого поискаДобавление элемента:
hash0
для рандомизации)Поиск элемента:
tophash
для быстрого отсеваРост map:
oldbuckets
в buckets
tophash
для ускорения поискаm := make(map[string]int, 100) // предварительное выделение
m["answer"] = 42
value, ok := m["answer"] // проверка существования
hmap
(заголовок) и bmap
(корзины)