Тип map👩‍💻 Многие знают, что map в Go — это удобный инструмент для работы с ключами и значениями. Но что происходит внутри? Структура➡️ map в Go - это хэш-таблица с поддержкой: -Хэширования ключей - каждый ключ проходит через хэш-функцию, что позволяет быстро находить соответствующие значения. -Бакетов - данные распределены по группам. Алгоритм работы 💭 1. Хэширование ключа При добавлении данных Go использует хэш-функцию для вычисления индекса, в котором хранится ключ-значение. 2. Бакеты Данные размещаются в бакетах. Каждый бакет может содержать несколько пар ключ-значение. Если бакет переполняется, данные распределяются в дополнительные структуры, такие как overflow-buckets. 3.Поиск При обращении к ключу Go снова вычисляет его хэш и идет в соответствующий бакет, затем линейно ищет ключ внутри (это позволяет добиться константной сложности выбора из мапы, так называемой O(1)). 4.Распределение памяти и релокация. Если map переполняется, запускается механизм реалокации и все существующие элементы ре-хэшируются. Оптимизация и нюансы💡 1. Порядок элементов в map не гарантируется, так как это зависит от внутреннего расположения в бакетах. 2. map не потокобезопасен — при доступе из нескольких горутин нужен мьютекс или sync.Map. 3. Реалокация может потреблять много памяти, поэтому важно не задавать излишне маленький map. В связи с тем что Go необходимо сравнивать ключи в мапе, на них наложено строгое ограничение - они должны быть comparable(сравнимыми). Почему же это важно? 1.Проверка равенства ключей Для работы map нужно уметь проверять, равны ли два ключа. Например, при поиске значения или проверке существования ключа. 2. Хэширование Go использует хэш-функцию для вычисления индекса бакета, где будет храниться ключ. Хэширование должно быть однозначным для одного и того же ключа. Если ключ нельзя сравнить, невозможно гарантировать, что данные будут правильно обработаны (например, при ре-хэшировании). 3. Оптимизация памяти и времени Если бы Go позволял использовать неcomparable типы (например, срезы), потребовались бы сложные алгоритмы сравнения (поэлементно). Это замедлило бы работу и усложнило реализацию. ✔️Comparable типы в go: простые типы; int, float64, string, bool. указатели: *T. пользовательские типы не содержащие срезов, мап или функций. 🚫Не Comparable типы в go: срезы - []T мапы - map[k]v функции - func Mindstorm | Подписаться
188 читали · 9 месяцев назад
Как добавить свой адрес на карту для доставок
Небольшая статья о том, чтобы доставки, такси и прочие нашли ваш дом. Или просто, чтобы ваш адрес появился в навигаторе. Рассмотрим варианты добавления в веб-версии. Обычно доставщики используют Я.карты или карты 2ГИС, но рассмотрим и другие популярные ресурсы. 1. Как добавить адрес на Яндекс.Картах Данными картами пользуются многие доставщики, курьеры и такси, поэтому добавление адреса на данном ресурсе первоочередно. Тут все достаточно просто. Открываем карту - https://yandex.ru/maps. Заходим в учетку Яндекса (если нет почты и учетки, то необходимо будет зарегистрироваться)...