- Определение карты
- Создание карты
- Обращение к элементам
- Проверка существования ключа
- Удаление элемента
- Размер карты
Карты (map) — это встроенный тип данных в Go для хранения пар «ключ-значение». Они позволяют быстро находить, добавлять и удалять данные по ключу. Карты используются везде, где нужен ассоциативный массив или словарь.
Определение карты
Карту можно объявить без инициализации:
var ages map[string]int
Здесь map[string]int — это тип карты, где:
- Ключ имеет тип
string. - Значение имеет тип
int.
Ключами в Go могут быть любые типы данных, которые сравнимы (comparable). Это значит, что они могут использоваться в операциях == и !=. Это могут быть строки, числа, булевы значения, массивы фиксированной длины и структуры со сравниваемыми полями. Срезы, карты и функции не могут быть ключами, так как они не поддерживают сравнение.
Создание карты
При объявлении карта равна nil.
var ages map[string]int
fmt.Println(ages == nil) // => true
Чтобы начать её использовать, необходимо явно выделить память с помощью make():
ages := make(map[string]int)
fmt.Println(ages == nil) // => false
ages["Alice"] = 25
ages["Bob"] = 30
fmt.Println(ages) // => map[Alice:25 Bob:30]
Можно создать карту и сразу инициализировать её значениями через литерал:
scores := map[string]int{
"Tom": 90,
"Jack": 80,
}
fmt.Println(scores) // => map[Jack:80 Tom:90]
Обращение к элементам
Чтобы получить значение по ключу, используется синтаксис map[key]:
fmt.Println(ages["Alice"]) // => 25
Если обратиться к несуществующему ключу, будет возвращено значение по умолчанию для типа, например 0 для чисел или пустая строка для string:
// ключа "Charlie" нет
fmt.Println(ages["Charlie"]) // => 0
Проверка существования ключа
Чтобы проверить, есть ли ключ в карте, используется «двойное присваивание»:
age, exists := ages["Charlie"]
fmt.Println(age, exists) // => 0 false
Переменная exists будет true, если ключ найден, и false — если нет.
Удаление элемента
Удалить элемент из карты можно с помощью встроенной функции delete():
delete(ages, "Alice")
fmt.Println(ages) // => map[Bob:30]
Если ключа нет, delete() просто ничего не делает.
Размер карты
Чтобы узнать количество элементов в карте, используется len():
fmt.Println(len(ages)) // => 1