Отображения: хранилища пар ключ-значение
Создание, чтение, запись и удаление элементов отображения
«Отображения: хранилища пар ключ-значение» — бесплатный урок Go Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.
Что такое отображение
Отображение в Go — это неупорядоченная коллекция пар «ключ — значение». Ключи должны иметь сравнимый тип (строки, целые числа и т. д.). Отображения являются ссылочными типами, основанными на хеш-таблице.
Создание отображений
Используйте литерал или make:
package main
import "fmt"
func main() {
ages := map[string]int{"Alice": 30, "Bob": 25}
cache := make(map[string]string)
fmt.Println(ages, cache)
}Чтение и запись
Получайте значения с помощью m[key], а присваивайте их с помощью m[key] = value. Чтение отсутствующего ключа возвращает нулевое значение:
package main
import "fmt"
func main() {
m := map[string]int{}
m["hits"] = 10
m["hits"]++
fmt.Println(m["hits"]) // 11
fmt.Println(m["missing"]) // 0
}Проверка существования ключа
Форма с двумя значениями позволяет отличить отсутствующий ключ от нулевого значения:
package main
import "fmt"
func main() {
m := map[string]int{"a": 0}
v, ok := m["a"]
fmt.Println(v, ok) // 0 true
v2, ok2 := m["z"]
fmt.Println(v2, ok2) // 0 false
}Удаление записей
Используйте встроенную функцию delete. Удаление несуществующего ключа ничего не делает:
package main
import "fmt"
func main() {
m := map[string]int{"x": 1, "y": 2}
delete(m, "x")
delete(m, "z") // no-op
fmt.Println(m) // map[y:2]
}Перебор отображения
Для перебора используйте range. Порядок не гарантируется:
package main
import "fmt"
func main() {
scores := map[string]int{"Alice": 90, "Bob": 85}
for name, score := range scores {
fmt.Printf("%s: %d\n", name, score)
}
}Отображения со значениями-структурами
Отображения могут хранить структуры в качестве значений. Обновляйте их через временную переменную (структуры в отображениях не являются адресуемыми):
package main
import "fmt"
type Point struct{ X, Y int }
func main() {
points := map[string]Point{"A": {1, 2}}
p := points["A"]
p.X = 99
points["A"] = p
fmt.Println(points["A"]) // {99 2}
}Нулевые отображения
Чтение из нулевого отображения выполняется так же, как из пустого отображения (возвращаются нулевые значения), но запись в нулевое отображение вызывает панику:
package main
func main() {
var m map[string]int
_ = m["key"] // ok — returns 0
// m["key"] = 1 // PANIC: assignment to nil map
}Отображения небезопасны для параллельного использования
Встроенное отображение Go не является безопасным при работе из нескольких горутин. Параллельное чтение допустимо, но для параллельной записи (или одновременных чтения и записи) требуется мьютекс или sync.Map:
package main
import "sync"
func main() {
var mu sync.Mutex
m := map[string]int{}
mu.Lock()
m["key"] = 1
mu.Unlock()
_ = m
}Подсчёт частот
Классический шаблон использования отображения — подсчёт количества вхождений:
package main
import "fmt"
func main() {
words := []string{"go", "is", "fast", "go", "is", "go"}
freq := map[string]int{}
for _, w := range words {
freq[w]++
}
fmt.Println(freq) // map[fast:1 go:3 is:2]
}Быстрая проверка
Что происходит при чтении ключа, которого нет в отображении Go?
Итоги: отображения
Основные выводы:
- Отображения — это неупорядоченные хранилища пар «ключ — значение»
- Используйте форму с двумя значениями, чтобы проверить существование ключа
- Никогда не записывайте данные в нулевое отображение
- Порядок перебора случаен — при необходимости отсортируйте ключи
- Защищайте отображения мьютексом в параллельном коде
Задание для практики
Напишите функцию, которая принимает строку и возвращает map[rune]int, подсчитывая, сколько раз встречается каждый символ. Проверьте её на строке "hello".
Часто задаваемые вопросы
Урок «Отображения: хранилища пар ключ-значение» бесплатный?
Да — полный текст урока «Отображения: хранилища пар ключ-значение» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.
Чему я научусь в уроке «Отображения: хранилища пар ключ-значение»?
Создание, чтение, запись и удаление элементов отображения Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Go Academy?
Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Отображения: хранилища пар ключ-значение»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Go Academy?
Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Массивы: коллекции фиксированной длины
- Срезы: динамические списки
- Отображения: хранилища пар ключ-значение
- Итерация по коллекциям с range