Как работи типът данни Map в Go?
sobes.tech AI
Отговор от AI
Картата — това е неупорядочена колекция от двойки "ключ-стойност" в Go.
Характеристики:
- Ключовете трябва да бъдат сравними типове данни (числа, низове, булеви, указатели, канали, интерфейси, ако динамичният тип е сравним, и масиви, ако техните елементи са сравними). Не могат да се използват срезове, функции или други карти като ключове.
- Стойностите могат да бъдат от всякакъв тип данни.
- Карта е тип на препратка, което означава, че променлива от тип карта съдържа указател към структурата данни на картата в паметта. Промените в картата чрез една променлива ще бъдат видими чрез други променливи, които се позовават на същата карта.
- Нулевата стойност за карта е
nil. Не може да се записва вnilкарта; опитът ще предизвика паника. - Размерът на картата се променя динамично при добавяне или премахване на елементи.
Вътрешна реализация: Картата в Go е реализирана като хеш таблица (hash table). Всеки ключ се хешира, а резултатът от хеширането се използва за определяне на позицията на свързаната стойност в таблицата.
// Създаване на карта
m := make(map[string]int)
// Добавяне на елементи
m["един"] = 1
m["два"] = 2
// Получаване на стойност
value, ok := m["един"] // value = 1, ok = true
value, ok = m["три"] // value = 0 (нулева стойност за int), ok = false
// Премахване на елемент
delete(m, "два")
// Итерация по карта (редът не е гарантиран)
for key, value := range m {
// ...
}
Сравнение на карти: Двете карти се считат за равни само ако се позовават на една и съща вътрешна структура, т.е. map1 == map2 само ако map1 и map2 са една и съща променлива. Не е разрешено сравняването на съдържанието на карта с оператора ==. За сравнение на съдържанието трябва да се итерира и по двете карти и да се сравнят техните елементи.
Производителност: Операциите за достъп, добавяне и премахване в карта имат средна сложност O(1). В най-лошия случай (например, при много колизии на хешове) могат да отнемат O(n) време.