Что такое мапы в Go?
Мапы — это встроенный тип данных в Go, который представляет собой ассоциативный массив или хеш-таблицу. Они позволяют хранить пары "ключ-значение", где каждому уникальному ключу соответствует определенное значение. Вот простой пример объявления мапы, где ключи — строки, а значения — целые числа:
Мапы очень удобны, когда нужно быстро находить значения по ключу. В отличие от слайсов, где доступ к элементам осуществляется по числовому индексу, в мапах мы используем ключи, которые могут быть разных типов.
Далее мы подробно разберем, как создавать, изменять и работать с мапами в Go. В конце статья я также оставил вам блок бесплатных материалов для обучения разработке.
Создание мап
Есть несколько способов создать мапу в Go. Самый простой — использовать встроенную функцию make():
Эта запись создает пустую мапу ages, где ключи — строки, а значения — целые числа. Другой способ — с помощью литерала мапы:
Здесь мы создаем мапу ages и сразу заполняем ее парами ключ-значение. Каждая пара указывается через двоеточие ключ: значение и отделяется запятыми. Важно понимать, что мапа — это ссылочный тип. Когда вы присваиваете одну мапу другой, они обе указывают на одни и те же базовые данные. Изменения в одной мапе будут видны в другой.
В этом примере изменение значения по ключу "Alice" в ages2 также меняет значение в исходной мапе ages1, так как обе мапы ссылаются на одни и те же данные.
Мапы являются фундаментальной структурой данных в Go, и их понимание необходимо для эффективной работы с данными. Однако, чтобы в полной мере использовать возможности мап, требуется уверенное владение основами языка, понимание типов данных, указателей и работы с памятью. Если вы хотите детальнее погрузиться в основы Go — приходите на наш большой курс Основы Golang. На курсе 193 урока и 16 упражнений, AI-тренажеры для безлимитной практики с кодом и задачами 24/7, решение задач с живым ревью наставника, еженедельные встречи с менторами.
Работа с мапами
Добавление и изменение элементов
Чтобы добавить новую пару ключ-значение в мапу или изменить значение по существующему ключу, используйте оператор индексирования []:
Получение элементов
Чтобы получить значение по ключу, также используйте оператор [], указав нужный ключ:
Важно учитывать, что при обращении к несуществующему ключу вы получите нулевое значение типа значений в мапе. Для int это будет 0.
Чтобы отличить нулевое значение от несуществующего ключа, используйте идиому присваивания из двух значений:
В этом примере ok — булева переменная, которая будет равна true, если ключ существует в мапе, и false - если нет.
Перебор элементов
Чтобы перебрать все элементы мапы, используйте цикл for с оператором range:
На каждой итерации цикла переменная name будет содержать очередной ключ, а age — соответствующее ему значение. Порядок перебора элементов мапы не гарантируется и может меняться от запуска к запуску программы. Если порядок важен, соберите ключи в отдельный слайс, отсортируйте его и затем перебирайте мапу по отсортированным ключам.
Удаление элементов
Чтобы удалить пару ключ-значение, воспользуйтесь встроенной функцией delete():
Эта запись удаляет из мапы ages элемент с ключом "Alice". Если такого ключа нет, ничего не произойдет.
Другие операции с мапами
Проверка на пустоту
Чтобы проверить мапу на пустоту, используйте встроенную функцию len():
Если len() возвращает 0, значит мапа пуста.
Сравнение мап
В Go нельзя напрямую сравнивать мапы через ==. Единственное сравнение - проверка на nil:
Если нужно сравнить содержимое двух мап, придется перебрать их элементы и сравнить по отдельности.
Мапы как значения
Значениями в мапе могут быть не только простые типы вроде строк и чисел, но и другие мапы или структуры. Пример "мапы мап":
Здесь groups — это мапа, где ключи - строки (названия групп), а значения - другие мапы (словари участников с их возрастом).
Заключение
Умение работать с мапами пригодится в самых разных задачах — от простого подсчета слов до построения сложных ассоциативных структур. Помните также про особенности мап. Ключи должны быть сравнимыми типами. Мапы — ссылочный тип, изменения в копии влияют на оригинал. При обращении к несуществующему ключу возвращается нулевое значение типа. Порядок перебора элементов не гарантирован.
Теперь вы знаете, как объявлять, изменять и перебирать мапы в Go. Пробуйте использовать их в своих программах и экспериментируйте с разными типами ключей и значений. С мапами ваш Go-код станет в разы эффективнее.
Работа с мапами в Go часто требует решения задач по сериализации и десериализации данных, особенно при работе с JSON или другими форматами. Чтобы эффективно выполнять эти операции, необходимо понимать принципы работы с интерфейсами, reflection и стандартной библиотекой Go. Глубокое погружение в эти темы доступно в нашем курсе Основы Golang. В первых 3 модулях уже доступно бесплатное содержание — начните погружаться в мир Go прямо сегодня.
Бесплатные полезности
1. Смотрите видео: код-ревью, собеседования и новости разработки на нашем Дзене – https://dzen.ru/purpleschool?tab=longs
2. Создайте личный план обучения и получите доступ к базе из 500+ бесплатных уроков в бесплатных картах развития на нашем сайте – https://purpleschool.ru/skills
3. Разберитесь в том, как устроен мир IT на бесплатном курсе «Основы разработки» – https://purpleschool.ru/course/code-basics