Перейти до основного вмісту
Модуль 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

Comma-ok: відрізнити «відсутнє» від «нульового значення»

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Завантаження…

Створіть map[string]int зі значеннями 'a' -> 1 і 'b' -> 2, потім додайте 'c' -> 3.

Завантаження редактора…
Показати підказку

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

Рішення доступне після 3 спроб

вправи#go.m4.l3.e2
Спроби: 0Завантаження…

Використовуйте шаблон коми-ok, щоб прочитати ключ «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]++ використовує неявне нульове значення.