🗺 Хеш-таблицы (Maps) в Go
Хеш-таблицы - один из самых удобных и быстрых способов хранения данных
в формате «ключ--значение». В Go этот тип структуры реализован через
map, и он работает как полноценная hash map.
📌 Что такое хеш-таблица?
Хеш-таблица (hash map) - это структура данных, которая:
- хранит пары «ключ--значение»,
- использует хеш-функцию для быстрого доступа,
- обеспечивает амортизированную скорость операций O(1),
- хранит элементы в бакетах,
- автоматически расширяется по мере роста данных.
В Go тип map - это полноценная хеш-таблица.
🛠 Создание карт (хеш-таблиц)
Через make():
myMap := make(map[string]int)
Через литерал:
myMap := map[string]int{
"item 1": 1,
"item 2": 2,
"item 3": 3,
}
➕ Добавление значений
myMap["favorite number"] = 5
Если ключа не было - он создаётся. Если ключ был - значение перезаписывается.
📖 Чтение значений
fav := myMap["favorite number"]
missing := myMap["age"] // zero value — 0
Так как map - хеш-таблица, поиск происходит очень быстро.
🔍 Проверка существования ключа
Стандартная идиома:
price, found := myMap["price"]
if !found {
fmt.Println("price not found")
}
found == false означает, что ключа в таблице нет.
❌ Удаление значений
delete(myMap, "favorite number")
🔁 Итерация по хеш-таблице
for key, value := range myMap {
fmt.Println(key, value)
}
⚠ Порядок обхода НЕ гарантируется, так как элементы распределены по хеш-бакетам.
🧠 Почему порядок не определён?
Потому что Go использует:
- хеш-функцию для распределения данных,
- бакеты с динамическим перераспределением,
- рандомизацию итерации (для предотвращения DoS-атак).
Поэтому порядок может меняться между запусками программы.
📛 Требования к ключам
Ключи должны быть сравнимыми, то есть Go должен иметь возможность:
- сравнить ключи оператором
==, - использовать их в хеш-функции.
Можно использовать: - string
- int, uint, float
- bool
- массивы (если все элементы сравнимы)
- указатели
- структуры (если все поля сравнимы)
Нельзя использовать: - срезы ([]T) - карты (map) - функции
📘 Итоги
mapв Go --- это полноценная хеш-таблица.- Хранит пары «ключ--значение» и обеспечивает быстрые операции.
- Создаётся через литерал или
make(). - Порядок обхода не гарантируется.
- Чтение отсутствующего ключа возвращает zero value.
- Ключи должны быть сравнимыми (comparable).
- Поддерживает добавление, удаление, проверку наличия и итерацию.