Vai al contenuto
eLearner.app
Modulo 4 · Lezione 3 di 518/50 nel corso~12 min
Lezioni del modulo (3/5)

Map: chiavi e valori

Una map è una tabella hash chiave→valore: map[K]V. Le map sono di riferimento: passate a una funzione condividono lo stesso storage. Vanno inizializzate prima di poterci scrivere (con make o letterale).

Creazione

Go
// con letterale
prices := map[string]int{"pane": 2, "latte": 3}

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

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

Operazioni base

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

m["b"] = 2              // insert/update
v := m["a"]             // get; se mancante: zero value
delete(m, "a")          // remove (ok anche se la chiave non esiste)
n := len(m)             // numero di entry

Comma-ok: distinguere "mancante" da "valore zero"

Go
v, ok := m["x"]
if !ok {
    fmt.Println("chiave assente")
} else {
    fmt.Println("trovata:", v)
}

È l'unico modo per sapere se una chiave esiste, perché m["x"] ritorna lo zero value anche se la chiave non c'è. Pattern fondamentale.

Iterazione: ordine randomizzato

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

Chiavi: solo tipi comparable

Le chiavi devono essere comparable: string, numeri, bool, puntatori, channel, interfacce, array di tipi comparable, struct di campi comparable. Slice, map e function non sono comparable → non possono essere chiavi.

Go
m := map[[2]int]string{}   // ok: array è comparable
// m := map[[]int]string{} // ERRORE: slice non è comparable

Pattern: contatori

Uno degli usi più comuni di map:

Go
words := []string{"a", "b", "a", "c", "b", "a"}
freq := map[string]int{}
for _, w := range words {
    freq[w]++   // l'accesso a una chiave mancante è 0 → 0+1 = 1
}
// freq = {"a": 3, "b": 2, "c": 1}

Prova tu

Esercizio#go.m4.l3.e1
Tentativi: 0Caricamento…

Crea una map[string]int con valori 'a' -> 1 e 'b' -> 2, poi aggiungi 'c' -> 3.

Caricamento editor…
Mostra suggerimento

Letterale: `map[K]V{"chiave": valore, ...}`.

Soluzione disponibile dopo 3 tentativi

Esercizio#go.m4.l3.e2
Tentativi: 0Caricamento…

Usa il pattern comma-ok per leggere la chiave 'x' (non presente) in v, ok e stampa entrambi.

Caricamento editor…
Mostra suggerimento

Doppio risultato: valore e booleano di presenza.

Soluzione disponibile dopo 3 tentativi

Quiz#go.m4.l3.e3
Pronto

Cosa succede scrivendo in una map nil?

Go
var m map[string]int
m["a"] = 1
Opzioni di risposta

Recap

  • map[K]V: chiave-valore, riferimento, hash-backed.
  • Inizializza con make o letterale; nil map → panic in scrittura.
  • v, ok := m[k] è l'unico modo per distinguere "assente" da "zero value".
  • delete(m, k) rimuove; ok anche se k non esiste.
  • Iterazione range: ordine randomizzato.
  • Chiavi: solo tipi comparable (no slice/map/func).
  • Pattern contatori: freq[k]++ sfrutta lo zero value implicito.