логотип PurpleSchool
  • Бесплатно
      Карта развитияОсновы разработкиCSS Flexbox
    • Новостные рассылкиИконка стрелки
    • База знанийИконка стрелки
    • Карьерные пути
      • Frontend React разработчик
      • Frontend Vue разработчик
      • Backend разработчик Node.js
      • Fullstack разработчик React / Node.js
      • Mobile разработчик React Native
      • Backend разработчик Golang
      • Devops инженер
    • О нас
      • Отзывы
      • Реферальная программа
      • О компании
      • Контакты
    • Иконка открытия меню
      • Сообщество
      • PurpleПлюс
      • AI тренажёр
      • Проекты
    логотип PurpleSchool
    ютуб иконка
    Telegram иконка
    VK иконка
    Курсы
    ГлавнаяКаталог курсовFrontendBackendFullstack
    Практика
    КарьераПроектыPurpleПлюс
    Материалы
    БлогБаза знаний
    Документы
    Договор офертаПолитика конфиденциальностиПроверка сертификатаМиграция курсовРеферальная программа
    Реквизиты
    ИП Ларичев Антон АндреевичИНН 773373765379contact@purpleschool.ru

    PurpleSchool © 2020 -2025 Все права защищены

  • Курсы
    Иконка слояПерейти в каталог курсов
    • FrontendИконка стрелки
    • BackendИконка стрелки
    • DevOpsИконка стрелки
    • MobileИконка стрелки
    • ТестированиеИконка стрелки
    • Soft-skillsИконка стрелки
    • ДизайнИконка стрелки
    • Картинка группы Общее

      Общее


      • Основы разработки
      • Основы Git
      • HTML и CSS
      • CSS Flexbox
      • Основы JavaScript
      • Продвинутый JavaScript
      • TypeScript с нуля
      • Neovim
    • Картинка группы React

      React


      • React и Redux Toolkit
      • Zustand
      • Next.js - с нуля
      • Feature-Sliced Design
    • Картинка группы Vue.js

      Vue.js


      • Vue 3 и Pinia
      • Nuxt
      • Feature-Sliced Design
    • Картинка группы Angular

      Angular


      • Angular 19 Иконка курсаСкоро!
    • Картинка группы Node.js

      Node.js


      • Основы Git
      • Основы JavaScript
      • Продвинутый JavaScript
      • Telegraf.js Иконка курсаСкоро!
      • TypeScript с нуля
      • Node.js с нуля
      • Nest.js с нуля
    • Картинка группы Golang

      Golang


      • Основы Git
      • Основы Golang
      • Продвинутый Golang
      • Golang - Templ Fiber HTMX
    • Картинка группы C#

      C#


      • Основы C#
    • Картинка группы PHP

      PHP


      • Основы PHP Иконка курсаСкоро!
    • Картинка группы Python

      Python


      • Основы Python
      • Продвинутый Python
    • Картинка группы Общее

      Общее


      • Основы разработки
      • Docker и Ansible
      • Kubernetes и Helm
      • Микросервисы
      • Neovim
    • Картинка группы Общее

      Общее


      • Основы разработки
      • Основы Git
      • Основы Linux
      • Bash скрипты
      • Docker и Ansible
      • Kubernetes и Helm
      • Микросервисы
      • Neovim
    • Картинка группы Общее

      Общее


      • Основы разработки
      • Основы Git
      • Neovim
    • Картинка группы React Native

      React Native


      • HTML и CSS
      • Основы JavaScript
      • Продвинутый JavaScript
      • TypeScript с нуля
      • React и Redux Toolkit
      • React Native и Expo Router
    • Картинка группы Swift

      Swift


      • Основы Swift и iOS
    • Картинка группы Общее

      Общее


      • Продвинутое тестирование Иконка курсаСкоро!
      • Основы тестирования ПО
    • Картинка группы Общее

      Общее


      • Собеседование
      • Современный Agile
    • Картинка группы Figma

      Figma


      • Основы дизайна
  • логотип PurpleSchool
    • Сообщество
    • PurpleПлюс
    • AI тренажёр
    • Проекты
    Главная
    Сообщество
    Мапы в Go: Полное руководство для начинающих

    Мапы в Go: Полное руководство для начинающих

    Аватар автора Мапы в Go: Полное руководство для начинающих

    Дмитрий

    Иконка календаря19 июля 2024
    GoGolangMapsjuniorИконка уровня junior
    Картинка поста Мапы в Go: Полное руководство для начинающих

    Введение: Что такое мапы в Go?

    Мапы - это встроенный тип данных в Go, который представляет собой ассоциативный массив или хеш-таблицу. Они позволяют хранить пары "ключ-значение", где каждому уникальному ключу соответствует определенное значение.

    Ключи в мапе должны быть сравнимыми типами, такими как строки, числа или булевы значения. Значения же могут быть любого типа, включая другие мапы или структуры.

    Вот простой пример объявления мапы, где ключи - строки, а значения - целые числа:

    var ages map[string]int
    

    Здесь ages - это мапа, где ключи имеют тип string (строка), а значения - int (целое число).

    Мапы очень удобны, когда нужно быстро находить значения по ключу. В отличие от слайсов, где доступ к элементам осуществляется по числовому индексу, в мапах мы используем ключи, которые могут быть разных типов.

    Далее мы подробно разберем, как создавать, изменять и работать с мапами в Go.

    Создание мап

    Есть несколько способов создать мапу в Go. Самый простой - использовать встроенную функцию make():

    ages := make(map[string]int)
    

    Эта запись создает пустую мапу ages, где ключи - строки, а значения - целые числа.

    Другой способ - с помощью литерала мапы:

    ages := map[string]int{
        "Alice": 25, 
        "Bob":   30,
        "John":   60,
    }
    

    Здесь мы создаем мапу ages и сразу заполняем ее парами ключ-значение. Каждая пара указывается через двоеточие ключ: значение и отделяется запятыми.

    Важно понимать, что мапа - это ссылочный тип. Когда вы присваиваете одну мапу другой, они обе указывают на одни и те же базовые данные. Изменения в одной мапе будут видны в другой.

    ages1 := map[string]int{ 
        "Alice": 25,
    }
    ages2  := ages1
    ages2["Alice"] = 30
    fmt.Println(ages1) // map[Alice:30]
    

    В этом примере изменение значения по ключу "Alice" в ages2 также меняет значение в исходной мапе `ages1, так как обе мапы ссылаются на одни и те же данные.

    Работа с мапами

    Добавление и изменение элементов

    Чтобы добавить новую пару ключ-значение в мапу или изменить значение по существующему ключу, используйте оператор индексирования []:

    ages := make(map[string]int)
    ages["Alice"] = 25 // Добавление нового элемента
    ages["Alice"] = 30 // Изменение значения
    

    В этом коде ["Alice"] - это ключ. Если такого ключа в мапе еще нет, то будет добавлена новая пара ключ-значение. Если ключ уже существует, значение по нему будет перезаписано.

    Получение элементов

    Чтобы получить значение по ключу, также используйте оператор [], указав нужный ключ:

    ages := map[string]int{
        "Alice": 25,
        "Bob":   30, 
    }
    fmt.Println(ages["Alice"]) // 25
    

    Здесь мы получаем значение по ключу "Alice", которое равно 25.

    Важно учитывать, что при обращении к несуществующему ключу вы получите нулевое значение типа значений в мапе. Для int это будет 0.

    ages := make(map[string]int)
    fmt.Println(ages["Abcde"]) // 0
    

    Чтобы отличить нулевое значение от несуществующего ключа, используйте идиому присваивания из двух значений:

    age, ok := ages["Abcde"]
    if !ok {
        fmt.Println("ключ не найден") 
    } else {
        fmt.Println(age)
    }
    

    В этом примере ok - булева переменная, которая будет равна true, если ключ существует в мапе, и false - если нет.

    Перебор элементов

    Чтобы перебрать все элементы мапы, используйте цикл for с оператором range:

    ages := map[string]int{
        "Alice": 25,
        "Bob":   30,
        "John":   60,
    }
    
    for name, age := range ages {
        fmt.Printf("%s is %d years old\n", name, age)
    }
    

    На каждой итерации цикла переменная name будет содержать очередной ключ, а age - соответствующее ему значение.

    Порядок перебора элементов мапы не гарантируется и может меняться от запуска к запуску программы.

    Если порядок важен, соберите ключи в отдельный слайс, отсортируйте его и затем перебирайте мапу по отсортированным ключам.

    Удаление элементов

    Чтобы удалить пару ключ-значение, воспользуйтесь встроенной функцией delete():

    delete(ages, "Alice")
    

    Эта запись удаляет из мапы ages элемент с ключом "Alice". Если такого ключа нет, ничего не произойдет.

    Другие операции с мапами

    Проверка на пустоту

    Чтобы проверить мапу на пустоту, используйте встроенную функцию len():

    ages := make(map[string]int)
    fmt.Println(len(ages) == 0) // true  
    

    Если len() возвращает 0, значит мапа пуста.

    Сравнение мап

    В Go нельзя напрямую сравнивать мапы через `==`. Единственное сравнение - проверка на nil:

    var ages map[string]int
    fmt.Println(ages == nil) // true
    

    Если нужно сравнить содержимое двух мап, придется перебрать их элементы и сравнить по отдельности.

    Мапы как значения

    Значениями в мапе могут быть не только простые типы вроде строк и чисел, но и другие мапы или структуры.

    Пример "мапы мап":

    groups := make(map[string]map[string]int)
    groups["developers"] = map[string]int{
        "Alice": 25,
        "Bob":   30,
    }
    

    Здесь groups - это мапа, где ключи - строки (названия групп), а значения - другие мапы (словари участников с их возрастом).

    Заключение

    Мапы - мощный и гибкий инструмент в Go. Умение работать с ними пригодится в самых разных задачах - от простого подсчета слов до построения сложных ассоциативных структур.

    Помните про особенности мап:

    • Ключи должны быть сравнимыми типами
    • Мапы - ссылочный тип, изменения в копии влияют на оригинал
    • При обращении к несуществующему ключу возвращается нулевое значение типа
    • Порядок перебора элементов не гарантирован

    Теперь вы знаете, как объявлять, изменять и перебирать мапы в Go. Пробуйте использовать их в своих программах и экспериментируйте с разными типами ключей и значений.

    С мапами ваш Go-код станет более эффективным, выразительным и удобным в работе. Успехов в освоении этой замечательной возможности языка Go!

    Иконка глаза13 728

    Комментарии

    0

    Постройте личный план изучения Продвинутый Golang до уровня Middle — бесплатно!

    Продвинутый Golang — часть карты развития Backend

    • step100+ шагов развития
    • lessons30 бесплатных лекций
    • lessons300 бонусных рублей на счет

    Бесплатные лекции

    Лучшие курсы по теме

    Иконка молнииНовый
    изображение курса

    Основы Python

    Антон Ларичев
    AI-тренажеры
    Практика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга5.0
    3 999 ₽ 6 990 ₽
    Подробнее
    изображение курса

    Основы C#

    Антон Ларичев
    AI-тренажеры
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.5
    3 999 ₽ 6 990 ₽
    Подробнее
    изображение курса

    Golang - Templ Fiber HTMX

    Антон Ларичев
    AI-тренажеры
    Практика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.8
    3 999 ₽ 6 990 ₽
    Подробнее
    Иконка чипа+4