Перейти к содержанию

Мапы

Мапа (map[K]V) — это словарь: ключ → значение. Используется везде, где нужно быстро находить данные по идентификатору: пользователи по логину, счётчики слов, кеши.

Что должен понять

  • Как создать мапу и записать в неё значение.
  • Чем make(map[K]V) отличается от литерала map[K]V{}.
  • Что такое comma-ok idiom для проверки, есть ли ключ.
  • Как удалить ключ через delete.
  • Что порядок обхода мапы случайный.

Создание

// через make
ages := make(map[string]int)
ages["Anna"] = 25
ages["Boris"] = 30

// через литерал
ages := map[string]int{
    "Anna":  25,
    "Boris": 30,
}

Объявить просто var m map[string]int — это nil-мапа, в неё нельзя писать (паника). Всегда инициализируй.

Чтение и comma-ok

v := ages["Anna"]          // 25
v = ages["Unknown"]        // 0 — zero value, ключа нет

// надёжная проверка:
v, ok := ages["Unknown"]
if !ok {
    fmt.Println("ключа нет")
}

okbool. Это и есть «comma-ok idiom». Используй его, когда 0 (или "") — допустимое значение и его нельзя путать с отсутствием.

Удаление

delete(ages, "Boris")
fmt.Println(ages)   // map[Anna:25]

Удалить несуществующий ключ — не ошибка, просто ничего не произойдёт.

Итерация

for name, age := range ages {
    fmt.Println(name, age)
}

Порядок не определён. Если нужен стабильный обход — собери ключи в слайс и отсортируй:

import "sort"

keys := make([]string, 0, len(ages))
for k := range ages {
    keys = append(keys, k)
}
sort.Strings(keys)
for _, k := range keys {
    fmt.Println(k, ages[k])
}

Пример: счётчик слов

words := []string{"go", "git", "go", "go", "git", "make"}
count := make(map[string]int)
for _, w := range words {
    count[w]++
}
fmt.Println(count)   // map[git:2 go:3 make:1]

Типичные ошибки

  • Пишут в nil-мапу — паника. Всегда make или литерал.
  • Используют значение вместо ok для проверки наличия. 0 — это и «нет ключа», и «реально ноль», их не различить.
  • Полагаются на порядок ключей при итерации.

Критерии приёмки модуля

  • Программа создаёт мапу string -> int и заполняет её данными.
  • Программа корректно проверяет наличие ключа через comma-ok.
  • Программа удаляет ключ через delete.
  • Программа реализует счётчик слов на мапе.

Дальше: Функции.