Мапы¶
Мапа (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("ключа нет")
}
ok — bool. Это и есть «comma-ok idiom». Используй его, когда 0
(или "") — допустимое значение и его нельзя путать с отсутствием.
Удаление¶
Удалить несуществующий ключ — не ошибка, просто ничего не произойдёт.
Итерация¶
Порядок не определён. Если нужен стабильный обход — собери ключи в слайс и отсортируй:
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. - Программа реализует счётчик слов на мапе.
Дальше: Функции.