Мапа #
Мапа - це тип даних формату ключ-значення. Цей тип дуже схожий на зріз. Відмінністю є те що у зрізі в нас йде впорядкований ряд ключів (індексів), а в мапі ключем може бути будь який тип, який можна порівнювати. Другою відмінністю є порядок цих ключів. У типі мапи ключі не мають порядку, їх порядок може бути яким завгодно. Єдине у чому ми можемо бути впевнені що вони всі одного типу.
Оголошення мапи відбувається за допомогою ключового слова map, потім у квадратних дужках пишемо тип даних для ключа, а після квадратних дужок - тип даних для значень:
var myMap map[string]int
таким чином ми оголосили змінну myMap
як мапу ключами якої будуть рядки, а значення - цілі числа.
Для створення мапи з початковим значенням, ми можемо використати вже відому нам конструкцію з фігурними дужками:
myMap := map[string]int{
"platform": 6,
"screw": 4,
"rock": 9,
// ...
}
У фігурних дужках ми пишемо елементи, розділяючи їх комами. Кожний елемент - це ключ, двокрапка і значення у заданих мапою типах. У нашому прикладі ключ це рядок, а значення - ціле число.
make #
Коли ми оголошуємо змінну типом map, значення, яке буде в цій змінній - nil
, тобто “нічого”. Для того щоб ми могли створити новий ключ, повинна бути створена сама мапа.Тож перед тим як спробувати встановлювати значення у мапу нам потрібно її створити. Ми можемо створити це способом вище, через фігурні дужки, які також можуть бути і порожніми, або використавши вбудовану функцію make
myMap := make(map[string]int)
Якщо ми спробуємо встановити значення будь якого ключа мапи до того як створимо її за допомогою make
, то ми отримаємо помилку при виконанні програми panic: assignment to entry in nil map
.
Доступ до кожного елементу відбувається через ключ. Наприклад, ми хочемо встановити значення 6
у нашу мапу під ключем “platform”
myMap["platform"] = 6
Якщо до цього часу ключа “platform” не існувало - він буде створений і в нього буде записано нове значення. Якщо ж в нас вже існував ключ “platform” то значення у ньому буде переписано на нове.
Отримати дані з мапи так само легко:
b := myMap["platform"]
таким чином ми створюємо змінну b і запишемо в неї значення з нашої мапи, які знаходяться під ключем “platform”. А що буде якщо ми спробуємо отримати данні під ключем, якого не існує?
c := myMap["road"]
У такому випадку не буде помилки, у змінну c
запишеться порожнє значення типу значення. Для типу int
порожнім значенням є 0
, тож після цього рядку у змінній c
буде 0
.
Але орієнтуватись на порожнє значення для того щоб дізнатись чи є ключ не дуже добре. Бо ключ може існувати, а значенням його може бути 0. Тож, коли нам потрібно дізнатись чи існує ключ, ми можемо скористатись цікавою особливістю мови Go - друге повернене значення.
c, ok := myMap["road"]
таким чином, в нас буде створено одразу дві змінні - c
та ok
. Перша, якщо ключ не існує, буде мати порожнє значення типу даних значень. Наприклад, для int
це 0
. А друга змінна - ok
(назва може бути будь яка) буде мати логічне значення в залежності від того чи існує ключ: true
- якщо ключ існує false
- якщо такого ключа не існує
Якщо нам потрібно тільки інформацію про те чи існує ключ, але не потрібно його значення, ми можемо скористатись ще однією особливістю мови Go - пропуск значення. Замість першої змінної ми пишемо знак підкреслення _
_, ok := myMap["road"]
Таким чином ми перевіримо чи існує ключ “road”
у нашій мапі.
len #
Так само як і зі зрізами ми можемо визначити кількість елементів у нашій мапі
cnt := len(myMap)
Таким чином ми створимо змінну cnt
значенням якої буде кількість елементів у нашій мапі.
delete #
Якщо нам потрібно видалити якийсь ключ, ми можемо скористатись вбудованою функцією delete
для видалення елементу з нашої мапи. У якості вхідних значень цій функції ми повинні передати нашу мапу та ключ, за яким ми хочемо видалити елемент
delete(myMap, "platform")
Після виконання такого рядку у мапі більше не буде елементу з ключем “platform”