Уроки модуля (3/5)
Карты: ключи и значения
Карта — это хеш-таблица ключ→значение: map[K]V. Карты являются справочными.
типы: передаются в функцию, они используют одно и то же хранилище. Они должны быть
инициализируются до того, как вы сможете писать в них (с помощью make или литерала).
Создание
// with a literal
prices := map[string]int{"pane": 2, "latte": 3}
// with make
counters := make(map[string]int)
counters["a"] = 1
// nil map (readable, NOT writable)
var m map[string]int
fmt.Println(m["x"]) // 0 — ok
// m["y"] = 1 // PANICОсновные операции
m := map[string]int{"a": 1}
m["b"] = 2 // insert/update
v := m["a"] // get; if missing: zero value
delete(m, "a") // remove (ok even if the key doesn't exist)
n := len(m) // number of entriesЗапятая-ок: отличить «отсутствует» от «нулевого значения»
v, ok := m["x"]
if !ok {
fmt.Println("key missing")
} else {
fmt.Println("found:", v)
}Это единственный способ узнать, существует ли ключ, поскольку m["x"] возвращает
нулевое значение, даже если ключа нет. Фундаментальный шаблон.
Итерация: рандомизированный порядок
for k, v := range m {
fmt.Println(k, v)
}Ключи: только сопоставимые типы
Ключи должны быть сопоставимы: string, числа, bool, указатели,
каналы, интерфейсы, массивы сопоставимых типов, структуры сопоставимых типов.
поля. Срезы, карты и функции несопоставимы → они не могут
быть ключами.
m := map[[2]int]string{} // ok: array is comparable
// m := map[[]int]string{} // ERROR: slice is not comparableУзор: счетчики
Один из наиболее распространенных вариантов использования карт:
words := []string{"a", "b", "a", "c", "b", "a"}
freq := map[string]int{}
for _, w := range words {
freq[w]++ // access to a missing key is 0 → 0+1 = 1
}
// freq = {"a": 3, "b": 2, "c": 1}Попробуйте это
Создайте карту[строка]int со значениями «a» -> 1 и «b» -> 2, затем добавьте «c» -> 3.
Показать подсказку
Литерал: `map[K]V{"ключ": значение, ...}`.
Решение доступно после 3 попыток
Используйте шаблон запятая-ок, чтобы прочитать ключ «x» (отсутствует) в v, ok и напечатать оба.
Показать подсказку
Два возвращаемых значения: значение и логическое значение присутствия.
Решение доступно после 3 попыток
Что происходит при записи в нулевую карту?
var m map[string]int
m["a"] = 1Резюме
map[K]V: ключ-значение, ссылка, хеш-поддержка.- Инициализируйте с помощью
makeили литерала; нулевая карта → паника при записи. v, ok := m[k]— единственный способ отличить «отсутствует» от «нулевого значения».delete(m, k)удаляет; ок, даже еслиkне существует. –rangeитерация: случайный порядок.- Ключи: только сопоставимые типы (без срезов/карт/функций).
- Шаблон счетчиков:
freq[k]++использует неявное нулевое значение.