Мапа

Мапа #

Мапа - це тип даних формату ключ-значення. Цей тип дуже схожий на зріз. Відмінністю є те що у зрізі в нас йде впорядкований ряд ключів (індексів), а в мапі ключем може бути будь який тип, який можна порівнювати. Другою відмінністю є порядок цих ключів. У типі мапи ключі не мають порядку, їх порядок може бути яким завгодно. Єдине у чому ми можемо бути впевнені що вони всі одного типу.

Map

Оголошення мапи відбувається за допомогою ключового слова 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”