Перейти к основному содержимому
Модуль 4 · Урок 3 из 518/50 в курсе~12 min
Уроки модуля (3/5)

Карты: ключи и значения

Карта — это хеш-таблица ключ→значение: map[K]V. Карты являются справочными. типы: передаются в функцию, они используют одно и то же хранилище. Они должны быть инициализируются до того, как вы сможете писать в них (с помощью make или литерала).

Создание

Go
// 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

Основные операции

Go
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

Запятая-ок: отличить «отсутствует» от «нулевого значения»

Go
v, ok := m["x"]
if !ok {
    fmt.Println("key missing")
} else {
    fmt.Println("found:", v)
}

Это единственный способ узнать, существует ли ключ, поскольку m["x"] возвращает нулевое значение, даже если ключа нет. Фундаментальный шаблон.

Итерация: рандомизированный порядок

Go
for k, v := range m {
    fmt.Println(k, v)
}

Ключи: только сопоставимые типы

Ключи должны быть сопоставимы: string, числа, bool, указатели, каналы, интерфейсы, массивы сопоставимых типов, структуры сопоставимых типов. поля. Срезы, карты и функции несопоставимы → они не могут быть ключами.

Go
m := map[[2]int]string{}   // ok: array is comparable
// m := map[[]int]string{} // ERROR: slice is not comparable

Узор: счетчики

Один из наиболее распространенных вариантов использования карт:

Go
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}

Попробуйте это

Упражнение#go.m4.l3.e1
Попыток: 0Загрузка…

Создайте карту[строка]int со значениями «a» -> 1 и «b» -> 2, затем добавьте «c» -> 3.

Загрузка редактора…
Показать подсказку

Литерал: `map[K]V{"ключ": значение, ...}`.

Решение доступно после 3 попыток

Упражнение#go.m4.l3.e2
Попыток: 0Загрузка…

Используйте шаблон запятая-ок, чтобы прочитать ключ «x» (отсутствует) в v, ok и напечатать оба.

Загрузка редактора…
Показать подсказку

Два возвращаемых значения: значение и логическое значение присутствия.

Решение доступно после 3 попыток

Quiz#go.m4.l3.e3
Готово

Что происходит при записи в нулевую карту?

Go
var m map[string]int
m["a"] = 1
Варианты ответа

Резюме

  • map[K]V: ключ-значение, ссылка, хеш-поддержка.
  • Инициализируйте с помощью make или литерала; нулевая карта → паника при записи.
  • v, ok := m[k] — единственный способ отличить «отсутствует» от «нулевого значения».
  • delete(m, k) удаляет; ок, даже если k не существует. – range итерация: случайный порядок.
  • Ключи: только сопоставимые типы (без срезов/карт/функций).
  • Шаблон счетчиков: freq[k]++ использует неявное нулевое значение.