Основы 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

Рекомендуемые программы