В Go при записи значения в map по ключу, например m[123] = value, происходит несколько шагов:
Что происходит при записи значения в map по ключу 123? Как значение попадает в хранилище?
В Go при записи значения в map по ключу, например m[123] = value, происходит несколько шагов:
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
В Go при записи значения в map по ключу, например m[123] = value, происходит несколько шагов:
- Хеширование ключа: Ключ
123преобразуется в хеш с помощью внутренней хеш-функции, специфичной для типа ключа. - Определение бакета: По хешу вычисляется индекс бакета (корзины) в массиве бакетов, где будет храниться пара ключ-значение.
- Поиск позиции в бакете: В выбранном бакете происходит поиск свободной ячейки или ячейки с таким же ключом.
- Запись значения: Если ключ уже есть, значение обновляется. Если ключа нет, создаётся новая запись с ключом и значением.
- Реорганизация при необходимости: Если бакет переполнен, карта может быть перераспределена (resize) — создаётся новый массив бакетов большего размера, и все пары перераспределяются.
Вся эта логика реализована в runtime Go и оптимизирована для скорости. Значение попадает в хранилище — внутреннюю структуру map, которая представляет собой массив бакетов с цепочками или открытой адресацией для коллизий.
Пример:
m := make(map[int]string)
m[123] = "example"
При этом 123 хешируется, определяется бакет, и значение "example" сохраняется в соответствующем месте в памяти.