Внутреннее устройство map
Разберитесь, как map хранит данные
«Внутреннее устройство map» — бесплатный урок Go Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.
Что такое отображение
Отображение хранит пары «ключ—значение». Каждый ключ сопоставляется с одним значением, а поиск по ключу в среднем выполняется очень быстро.
В Go отображение записывается так: map[KeyType]ValueType.
package main
import "fmt"
func main() {
ages := map[string]int{"Ann": 30, "Bob": 25}
fmt.Println(ages["Ann"])
}Хеш-таблицы внутри
Отображения в Go реализованы как хеш-таблицы. Хеш-функция преобразует каждый ключ в число, указывающее на корзину, где хранится значение.
Корзины
Отображение хранит записи в корзинах. Каждая корзина содержит несколько пар «ключ—значение». Хеш ключа определяет, в какую корзину он попадёт, благодаря чему среднее время поиска составляет O(1).
Создание отображения
Пустое отображение можно создать с помощью make. При необходимости передайте приблизительный размер, чтобы заранее выделить память.
package main
import "fmt"
func main() {
scores := make(map[string]int)
scores["x"] = 10
fmt.Println(scores)
}Нулевые отображения
Отображение, объявленное без инициализации, имеет значение nil. Из нулевого отображения можно читать значения (Вы получите нулевые значения), но запись в него вызывает панику. Всегда инициализируйте отображение перед записью.
package main
import "fmt"
func main() {
var m map[string]int
fmt.Println(m == nil)
fmt.Println(m["missing"])
}Добавление и обновление
Присваивание по ключу добавляет новую запись или заменяет существующее значение.
package main
import "fmt"
func main() {
m := map[string]int{"a": 1}
m["b"] = 2
m["a"] = 99
fmt.Println(m)
}Удаление ключей
Встроенная операция delete удаляет ключ. Удаление отсутствующего ключа безопасно и ничего не делает.
package main
import "fmt"
func main() {
m := map[string]int{"a": 1, "b": 2}
delete(m, "a")
fmt.Println(m)
}Длина отображения
len возвращает количество пар «ключ—значение», находящихся в отображении.
package main
import "fmt"
func main() {
m := map[string]int{"a": 1, "b": 2, "c": 3}
fmt.Println(len(m))
}Отображения растут автоматически
По мере добавления записей Go увеличивает внутреннюю таблицу и может заново распределять ключи по новым корзинам. Это происходит автоматически, поэтому Вам не нужно вручную управлять ёмкостью.
Допустимые типы ключей
Ключи должны быть сравнимыми: их типы можно использовать с оператором ==. Подходят строки, числа, логические значения и структуры со сравнимыми полями. Срезы и отображения не могут быть ключами.
package main
import "fmt"
func main() {
type Point struct{ X, Y int }
m := map[Point]string{{1, 2}: "origin-ish"}
fmt.Println(m[Point{1, 2}])
}Ссылочная семантика
Значение отображения — это ссылка на базовые данные. Передача отображения в функцию позволяет этой функции изменять то же отображение; указатель не нужен.
package main
import "fmt"
func addOne(m map[string]int) {
m["count"]++
}
func main() {
m := map[string]int{"count": 0}
addOne(m)
fmt.Println(m)
}Быстрая проверка
Что произойдёт, если попытаться записать ключ в нулевое отображение?
Итоги
Внутреннее устройство отображений:
- отображения — это хеш-таблицы с корзинами
- среднее время поиска, вставки и удаления — O(1)
- ключи должны быть сравнимыми; запись в нулевое отображение вызывает панику
- отображения обладают ссылочной семантикой
Часто задаваемые вопросы
Урок «Внутреннее устройство map» бесплатный?
Да — полный текст урока «Внутреннее устройство map» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.
Чему я научусь в уроке «Внутреннее устройство map»?
Разберитесь, как map хранит данные Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Go Academy?
Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Внутреннее устройство map»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Go Academy?
Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Внутреннее устройство map
- Проверка существования
- Использование map как множества
- Итерация и порядок