0Pricing
Go Academy · Урок

Внутреннее устройство 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 — локальная установка не требуется.

Все уроки этого курса

  1. Внутреннее устройство map
  2. Проверка существования
  3. Использование map как множества
  4. Итерация и порядок
← Назад к Go Academy