Sobes.tech
Junior

Cum funcționează tipul de date Map în Go?

sobes.tech AI

Răspuns de la AI

Map — o este o colecție nesortată de perechi "cheie-valoare" în Go.

Caracteristici:

  • Cheile trebuie să fie tipuri de date comparabile (numere, șiruri, valori booleene, pointeri, canale, interfețe, dacă tipul dinamic este comparabil, și array-uri dacă elementele lor sunt comparabile). Slices, funcții și alte maps nu pot fi folosite ca chei.
  • Valorile pot fi de orice tip de date.
  • Map este un tip de referință, ceea ce înseamnă că o variabilă de tip map conține un pointer către structura de date map în memorie. Modificările aduse map-ului printr-o variabilă vor fi vizibile și prin alte variabile care fac referire la același map.
  • Valoarea nulă pentru map este nil. Nu se poate scrie într-un map nil; încercarea va provoca un panic.
  • Dimensiunea map-ului se schimbă dinamic pe măsură ce se adaugă sau se elimină elemente.

Implementare internă: Map în Go este implementat ca un tabel de dispersie (hash table). Fiecare cheie este hash-ată, iar rezultatul hash-ului este folosit pentru a determina poziția valorii asociate în tabel.

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

// Adăugare elemente
m["unu"] = 1
m["doi"] = 2

// Obținere valoare
value, ok := m["unu"] // value = 1, ok = true
value, ok = m["trei"]  // value = 0 (valoare zero pentru int), ok = false

// Ștergere element
delete(m, "doi")

// Iterare pe map (ordinea nu este garantată)
for key, value := range m {
	// ...
}

Compararea mapurilor: Două mapuri sunt considerate egale doar dacă fac referire la aceeași structură internă, adică, map1 == map2 doar dacă map1 și map2 sunt aceeași variabilă. Compararea conținutului unui map cu == nu este permisă. Pentru a compara conținutul, trebuie să iterezi peste ambele mapuri și să compari elementele lor.

Performanță: Operațiile de acces, adăugare și ștergere în map au, în medie, complexitatea O(1). În cel mai rău caz (de exemplu, cu multe coliziuni de hash), pot dura O(n) timp.