Sobes.tech
Junior

Jak działa typ danych Map w Go?

sobes.tech AI

Odpowiedź od AI

Map — to nieuporządkowana kolekcja par "klucz-wartość" w Go.

Cechy:

  • Klucze muszą być porównywalnymi typami danych (liczby, łańcuchy, wartości logiczne, wskaźniki, kanały, interfejsy, jeśli typ dynamiczny jest porównywalny, oraz tablice, jeśli ich elementy są porównywalne). Nie można używać jako kluczy slices, funkcji ani innych map.
  • Wartości mogą być dowolnego typu danych.
  • Map jest typem odwołania, co oznacza, że zmienna typu map zawiera wskaźnik do struktury danych map w pamięci. Zmiany w mapie dokonane przez jedną zmienną będą widoczne przez inne zmienne odwołujące się do tego samego map.
  • Wartość zerowa dla mapy to nil. Nie można zapisywać do mapy nil; próba spowoduje panic.
  • Rozmiar mapy zmienia się dynamicznie w miarę dodawania lub usuwania elementów.

Implementacja wewnętrzna: Map w Go jest zaimplementowana jako tablica haszująca (hash table). Każdy klucz jest haszowany, a wynik haszowania jest używany do określenia położenia powiązanej wartości w tablicy.

// Tworzenie mapy
m := make(map[string]int)

// Dodawanie elementów
m["jeden"] = 1
m["dwa"] = 2

// Pobieranie wartości
value, ok := m["jeden"] // value = 1, ok = true
value, ok = m["trzy"]  // value = 0 (wartość zerowa dla int), ok = false

// Usuwanie elementu
delete(m, "dwa")

// Iteracja po mapie (kolejność nie jest gwarantowana)
for key, value := range m {
	// ...
}

Porównanie map: Dwie mapy są uważane za równe tylko wtedy, gdy odwołują się do tej samej wewnętrznej struktury, czyli map1 == map2 tylko wtedy, gdy map1 i map2 są tą samą zmienną. Nie można porównywać zawartości mapy operatorem ==. Aby porównać zawartość, trzeba iterować po obu mapach i porównywać ich elementy.

Wydajność: Operacje dostępu, dodawania i usuwania w mapie mają średnią złożoność O(1). W najgorszym przypadku (np. przy dużej liczbie kolizji hashy) mogą wymagać O(n) czasu.