Sobes.tech
Junior

Jak funguje datový typ Map v Go?

sobes.tech AI

Odpověď od AI

Mapa — je nespořádaná kolekce párů "klíč-hodnota" v Go.

Vlastnosti:

  • Klíče musí být porovnatelné datové typy (čísla, řetězce, boolean, ukazatele, kanály, rozhraní, pokud je dynamický typ porovnatelný, a pole, pokud jsou jejich prvky porovnatelné). Slices, funkce a jiné mapy nelze použít jako klíče.
  • Hodnoty mohou být jakéhokoliv datového typu.
  • Map je odkazový typ, což znamená, že proměnná typu map obsahuje ukazatel na datovou strukturu mapy v paměti. Změny v mapě provedené přes jednu proměnnou budou viditelné přes jiné proměnné odkazující na stejnou mapu.
  • Nulová hodnota pro mapu je nil. Do nil mapy nelze zapisovat; pokus o to způsobí paniku.
  • Velikost mapy se dynamicky mění při přidávání nebo odstraňování prvků.

Vnitřní implementace: Map v Go je implementována jako hash tabulka (hash table). Každý klíč je hashován a výsledek hashování se používá k určení polohy přiřazené hodnoty v tabulce.

// Vytvoření mapy
m := make(map[string]int)

// Přidání prvků
m["jeden"] = 1
m["dva"] = 2

// Získání hodnoty
value, ok := m["jeden"] // value = 1, ok = true
value, ok = m["tři"]  // value = 0 (nulová hodnota pro int), ok = false

// Odstranění prvku
delete(m, "dva")

// Iterace přes mapu (pořadí není garantováno)
for key, value := range m {
	// ...
}

Porovnání map: Dvě mapy jsou považovány za rovné pouze pokud odkazují na stejnou vnitřní strukturu, tj. map1 == map2 pouze pokud map1 a map2 jsou stejná proměnná. Obsah mapy nelze porovnat operátorem ==. Pro porovnání obsahu je třeba iterovat přes obě mapy a porovnat jejich prvky.

Výkon: Operace přístupu, přidání a odstranění v mapě mají průměrnou složitost O(1). V nejhorším případě (například při velkém počtu kolizí hashů) mohou trvat O(n) času.