Зарегистрируйтесь, чтобы продолжить обучение

Вложенные карты Основы Go

Вложенные карты (map внутри map) используются, когда нужно хранить данные с двумя уровнями ключей. Например, если у нас есть пользователи, и у каждого из них есть набор настроек, можно использовать карту вида: map[string]map[string]string.

Пример: настройки пользователей

Допустим, у нас есть несколько пользователей, и мы хотим хранить для каждого их настройки:

settings := map[string]map[string]string{
    "alice": {
        "theme":"dark",
        "lang": "en",
    },
    "bob": {
        "theme":"light",
        "lang": "fr",
    },
}

fmt.Println(settings["alice"]["theme"]) // => dark

В этом примере:

  • Ключи верхнего уровня — это имена пользователей ("alice", "bob").
  • Значения — карты с настройками (пары "ключ-настройки" : "значение").

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

Вот так будет выглядеть добавление вложенной карты:

settings["charlie"] = map[string]string{
    "theme": "dark",
    "lang":  "es",
}

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

settings["alice"]["lang"] = "ru"
fmt.Println(settings["alice"]) // => map[lang:ru theme:dark]

Инициализация вложенной карты

Если вложенная карта для пользователя ещё не создана, при обращении к ней будет возвращён nil. Перед изменением такой карты её нужно инициализировать:

user := "david"

fmt.Println(settings[user] == nil) // => true

if settings[user] == nil {
    settings[user] = make(map[string]string)
}
settings[user]["theme"] = "light"

fmt.Println(settings[user] == nil) // => false

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

Удаление вложенного элемента карты можно выполнить с delete():

  • Удалить одну настройку пользователя:

    delete(settings["bob"], "lang")
    
  • Удалить все настройки пользователя:

    delete(settings, "alice")
    

Перебор вложенных карт

Можно пройтись по всем пользователям и их настройкам:

settings := map[string]map[string]string{
    "alice": {
        "theme": "dark",
        "lang":  "en",
    },
    "bob": {
        "theme": "light",
        "lang":  "fr",
    },
}

for user, userSettings := range settings {
    fmt.Printf("User: %s\n", user)
    for key, value := range userSettings {
        fmt.Printf("  %s = %s\n", key, value)
    }
}

Пример вывода:

User: alice
  lang = ru
  theme = dark
User: bob
  theme = light

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff