Коллекции: массивы, срезы и отображения

Map: создание, чтение, запись, удаление и проверка ключа

Содержание курса

Подсчёт частот токенов в map без инициализации отдельных ключей

Допустим, у вас есть срез токенов — слов, тегов, идентификаторов — и нужно посчитать, сколько раз встречается каждый:

tokens := []string{"go", "map", "go", "range", "go", "map"}

freq := make(map[string]int)
for _, t := range tokens {
    freq[t]++
}

// freq: {"go": 3, "map": 2, "range": 1}

Ключевой момент — строка freq[t]++. Когда токен встречается впервые, ключа t в map ещё нет. freq[t] возвращает нулевое значение int, то есть 0. Затем ++ увеличивает его до 1, и пара сохраняется. При следующем вхождении того же токена ключ уже существует, и счётчик увеличивается с реального значения.

Никакой предварительной проверки if _, ok := freq[t]; !ok { freq[t] = 0 } не нужно — нулевое значение типа делает её избыточной. Это намеренное свойство map в Go, и паттерн freq[t]++ — стандартный способ агрегации.

После заполнения map можно обойти результат через range:

for word, count := range freq {
    fmt.Printf("%s: %d\n", word, count)
}

Порядок вывода будет произвольным — что именно ожидать от range по map, вы уже знаете.