Salt la conținutul principal
Modulul 4 · Lecția 3 din 518/50 în curs~12 min
Lecții din modul (3/5)

Hărți: chei și valori

O hartă este un tabel hash cheie→valoare: map[K]V. Hărțile sunt de referință tipuri: trecute la o funcție, împart aceeași stocare. Trebuie să fie inițializat înainte de a le putea scrie (cu make sau un literal).

Creare

Go
// with a literal
prices := map[string]int{"pane": 2, "latte": 3}

// with make
counters := make(map[string]int)
counters["a"] = 1

// nil map (readable, NOT writable)
var m map[string]int
fmt.Println(m["x"])    // 0 — ok
// m["y"] = 1          // PANIC

Operații de bază

Go
m := map[string]int{"a": 1}

m["b"] = 2              // insert/update
v := m["a"]             // get; if missing: zero value
delete(m, "a")          // remove (ok even if the key doesn't exist)
n := len(m)             // number of entries

Virgulă-ok: distingerea „lipsă” de „valoare zero”

Go
v, ok := m["x"]
if !ok {
    fmt.Println("key missing")
} else {
    fmt.Println("found:", v)
}

Este singura modalitate de a ști dacă o cheie există, deoarece m["x"] returnează valoarea zero chiar și atunci când cheia nu este acolo. Un model fundamental.

Iterație: ordine aleatorie

Go
for k, v := range m {
    fmt.Println(k, v)
}

Chei: numai tipuri comparabile

Cheile trebuie să fie comparabile: string, numere, bool, indicatori, canale, interfețe, matrice de tipuri comparabile, structuri de comparabile câmpuri. Slicele, hărțile și funcțiile nu sunt comparabile → nu pot fii chei.

Go
m := map[[2]int]string{}   // ok: array is comparable
// m := map[[]int]string{} // ERROR: slice is not comparable

Model: contoare

Una dintre cele mai comune utilizări ale hărților:

Go
words := []string{"a", "b", "a", "c", "b", "a"}
freq := map[string]int{}
for _, w := range words {
    freq[w]++   // access to a missing key is 0 → 0+1 = 1
}
// freq = {"a": 3, "b": 2, "c": 1}

Încearcă

Exercițiu#go.m4.l3.e1
Încercări: 0Se încarcă…

Creați o hartă[șir]int cu valorile „a” -> 1 și „b” -> 2, apoi adăugați „c” -> 3.

Se încarcă editorul...
Afișează indiciu

Literal: `map[K]V{"key": value, ...}`.

Soluție disponibilă după 3 încercări

Exercițiu#go.m4.l3.e2
Încercări: 0Se încarcă…

Utilizați modelul virgulă-ok pentru a citi cheia „x” (nu este prezentă) în v, ok și imprimați ambele.

Se încarcă editorul...
Afișează indiciu

Două valori returnate: valoarea și un boolean de prezență.

Soluție disponibilă după 3 încercări

Quiz#go.m4.l3.e3
Gata

Ce se întâmplă când scrii pe o hartă zero?

Go
var m map[string]int
m["a"] = 1
Opțiuni de răspuns

Recapitulare

  • map[K]V: cheie-valoare, referință, hash-backed.
  • Inițializați cu make sau un literal; nil map → panică la scriere.
  • v, ok := m[k] este singura modalitate de a distinge „lipsă” de „valoare zero”.
  • delete(m, k) elimină; ok chiar dacă k nu există.
  • range iterație: comandă aleatorie.
  • Taste: numai tipuri comparabile (fără slice/hartă/funcție).
  • Model de contoare: freq[k]++ folosește valoarea implicită zero.