Go Мапи
Go Мапи
Мапи використовуються для зберігання значень даних у парах ключ:значення.
Кожен елемент у мапі є парою ключ:значення.
Мапа — це невпорядкована колекція, яка не допускає повторень.
Довжина мапи – це кількість її елементів. Її можна знайти за допомогою функції len()
.
Значення мапи за умовчанням дорівнює нулю.
Мапи містять посилання на базову хеш-таблицю.
Go має кілька способів створення мап.
Створення мап за допомогою var
and :=
Синтаксис
var a = map[KeyType]ValueType{key1:value1, key2:value2,...}
b := map[KeyType]ValueType{key1:value1, key2:value2,...}
Приклад
У цьому прикладі показано, як створювати мапи в Go. Зверніть увагу на порядок у коді та на виводі.
package main
import ("fmt")
func main() {
var a = map[string]string{"brand": "Ford", "model": "Mustang", "year": "1964"}
b := map[string]int{"Oslo": 1, "Bergen": 2, "Trondheim": 3, "Stavanger": 4}
fmt.Printf("a\t%v\n", a)
fmt.Printf("b\t%v\n", b)
}
Результат:
a map[brand:Ford model:Mustang year:1964]
b map[Bergen:2 Oslo:1 Stavanger:4 Trondheim:3]
Примітка: Порядок елементів мапи, визначений у коді, відрізняється від того, як вони зберігаються. Дані зберігаються таким чином, щоб мати ефективне отримання даних із мапи.
Створення мап за допомогою функції make()
:
Синтаксис
var a = make(map[KeyType]ValueType)
b := make(map[KeyType]ValueType)
Приклад
У цьому прикладі показано, як створювати мапи в Go за допомогою функції make()
.
package main
import ("fmt")
func main() {
var a = make(map[string]string) // Зараз мапа порожня
a["brand"] = "Ford"
a["model"] = "Mustang"
a["year"] = "1964"
// більше не порожня
b := make(map[string]int)
b["Oslo"] = 1
b["Bergen"] = 2
b["Trondheim"] = 3
b["Stavanger"] = 4
fmt.Printf("a\t%v\n", a)
fmt.Printf("b\t%v\n", b)
}
Результат:
a map[brand:Ford model:Mustang year:1964]
b map[Bergen:2 Oslo:1 Stavanger:4 Trondheim:3]
Створення порожньої мапи
Є два способи створити порожню мапу. Один — за допомогою функції make()
, а інший — за допомогою такого синтаксису:
Синтаксис
var a map[KeyType]ValueType
Примітка: Функція make()
— це правильний спосіб створити порожню карту. Якщо ви створите порожню карту іншим способом і запишете в неї, це спричинить паніку під час виконання.
Приклад
У цьому прикладі показано різницю між оголошенням порожньої мапи за допомогою функції make()
і без неї.
package main
import ("fmt")
func main() {
var a = make(map[string]string)
var b map[string]string
fmt.Println(a == nil)
fmt.Println(b == nil)
}
Результат:
false
true
Дозволені типи ключів
Ключ мапи може мати будь-який тип даних, для якого визначено оператор рівності (==
). До них відносяться:
- Булеві
- Числа
- Рядки
- Масиви
- Вказівники
- Структури
- Інтерфейси (якщо динамічний тип підтримує рівність)
Недійсні типи ключів:
- Слайси
- Мапи
- Функції
Ці типи недійсні, оскільки для них не визначено оператор рівності (==
).
Дозволені типи значень
Значення мапи можуть мати будь-який тип.
Доступ до елементів мапи
Ви можете отримати доступ до елементів мапи за допомогою:
Синтаксис
value = map_name[key]
Приклад
package main
import ("fmt")
func main() {
var a = make(map[string]string)
a["brand"] = "Ford"
a["model"] = "Mustang"
a["year"] = "1964"
fmt.Printf(a["brand"])
}
Результат:
Ford
Оновлення та додавання елементів мапи
Оновлення або додавання елементів виконується:
Синтаксис
map_name[key] = value
Приклад
У цьому прикладі показано, як оновлювати та додавати елементи до мапи.
package main
import ("fmt")
func main() {
var a = make(map[string]string)
a["brand"] = "Ford"
a["model"] = "Mustang"
a["year"] = "1964"
fmt.Println(a)
a["year"] = "1970" // Оновлення елемента
a["color"] = "red" // Додавання елемента
fmt.Println(a)
}
Результат:
map[brand:Ford model:Mustang year:1964]
map[brand:Ford color:red model:Mustang year:1970]
Видалити елемент із мапи
Вилучення елементів виконується за допомогою функції delete()
.
Синтаксис
delete(map_name, key)
Приклад
package main
import ("fmt")
func main() {
var a = make(map[string]string)
a["brand"] = "Ford"
a["model"] = "Mustang"
a["year"] = "1964"
fmt.Println(a)
delete(a,"year")
fmt.Println(a)
}
Результат:
map[brand:Ford model:Mustang year:1964]
map[brand:Ford model:Mustang]
Перевірте наявність певних елементів на мапі
Ви можете перевірити, чи існує певний ключ на мапі, використовуючи:
Синтаксис
val, ok :=map_name[key]
Якщо ви хочете лише перевірити існування певного ключа, ви можете використовувати порожній ідентифікатор (_
) замість val.
Приклад
package main
import ("fmt")
func main() {
var a = map[string]string{"brand": "Ford", "model": "Mustang", "year": "1964", "day":""}
val1, ok1 := a["brand"] // Перевірка наявного ключа та його значення
val2, ok2 := a["color"] // Перевірка неіснуючого ключа та його значення
val3, ok3 := a["day"] // Перевірка наявного ключа та його значення
_, ok4 := a["model"] // Перевіряється лише наявний ключ, а не його значення
fmt.Println(val1, ok1)
fmt.Println(val2, ok2)
fmt.Println(val3, ok3)
fmt.Println(ok4)
}
Результат:
Ford true
false
true
true
Пояснення прикладу
У цьому прикладі ми перевірили наявність різних ключів у мапі.
Ключ "color" не існує на мапі. Отже, значенням є порожній рядок ('').
Змінна ok2 використовується, щоб дізнатися, чи існує ключ. Оскільки ми отримали б те саме значення, якби значення ключа "color" було порожнім. Це справа для val3.
Мапи є посиланнями
Мапи є посиланнями на хеш-таблиці.
Якщо дві змінні відображення посилаються на одну хеш-таблицю, зміна вмісту однієї змінної впливає на вміст іншої.
Приклад
package main
import ("fmt")
func main() {
var a = map[string]string{"brand": "Ford", "model": "Mustang", "year": "1964"}
b := a
fmt.Println(a)
fmt.Println(b)
b["year"] = "1970"
fmt.Println("Після зміни на b:")
fmt.Println(a)
fmt.Println(b)
}
Результат:
map[brand:Ford model:Mustang year:1964]
map[brand:Ford model:Mustang year:1964]
Після зміни на b:
map[brand:Ford model:Mustang year:1970]
map[brand:Ford model:Mustang year:1970]
Ітерація по мапах
Ви можете використовувати range
для перебирання мап.
Приклад
У цьому прикладі показано, як перебирати елементи на мапі. Зверніть увагу на порядок елементів у вихідних даних.
package main
import ("fmt")
func main() {
a := map[string]int{"one": 1, "two": 2, "three": 3, "four": 4}
for k, v := range a {
fmt.Printf("%v : %v, ", k, v)
}
}
Результат:
two : 2, three : 3, four : 4, one : 1,
Ітерація мап у певному порядку
Мапи — це невпорядковані структури даних. Якщо вам потрібно виконати ітерацію по мапі в певному порядку, ви повинні мати окрему структуру даних, яка визначає цей порядок.
Приклад
package main
import ("fmt")
func main() {
a := map[string]int{"one": 1, "two": 2, "three": 3, "four": 4}
var b = []string // визначення порядку
b = append(b, "one", "two", "three", "four")
for k, v := range a { // цикл без порядку
fmt.Printf("%v : %v, ", k, v)
}
fmt.Println()
for _, element := range b { // цикл у визначеному порядку
fmt.Printf("%v : %v, ", element, a[element])
}
}
Результат:
two : 2, three : 3, four : 4, one : 1,
one : 1, two : 2, three : 3, four : 4,