Назад к урокам

Хеш-таблицы (Maps) в Go

Урок объясняет, как работает тип map в Go как полноценная хеш-таблица: хранение данных в формате ключ–значение, хеширование, доступ за O(1), добавление, удаление, проверка существования и особенности итерации.

Начинающий10 min

🗺 Хеш-таблицы (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).
  • Поддерживает добавление, удаление, проверку наличия и итерацию.