НАЙКРАЩИЙ САЙТ ДЛЯ ВЕБ-РОЗРОБНИКІВ
Golang. Уроки для початківців

En

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,
Спробуйте самі »