Maps
Le maps sono simili agli array associativi di altri linguaggi come il Perl.
Sono quindi dei valori indicizzati da chiavi. Il tipo della chiave e quello del valore possono essere diversi.
Esempio:
(100maps.go):
package main
import "fmt"
func main() {
// Una map è un tipo associativo = hash
// Costruita in memoria dinamica
// map[chiave]valore - niente spazi
m := make(map[string]int)
// Assegnazione di valore a chiave
m["k1"] = 7
m["k2"] = 13
// Stampa dell'intera map
// Ordine casuale
fmt.Println("map:", m)
// Valore di una chiave
v1 := m["k1"]
fmt.Println("v1: ", v1)
// Dimensione della map
fmt.Println("len:", len(m))
// deallocazione di un elemento tramite chiave
delete(m, "k2")
fmt.Println("map:", m)
// Un elemento mai assegnato vale zero
// un elemento assegnato a zero vale zero
// Per distinguere c'è un secondo valore
// di ritorno, opzionale, booleano
m["k3"] = 0
x1, exists := m["k3"]
fmt.Print("k3: ")
if exists {
fmt.Println(x1)
} else {
fmt.Println("missing")
}
x2, exists := m["k4"]
fmt.Print("k4: ")
if exists {
fmt.Println(x2)
} else {
fmt.Println("missing")
}
// Dichiarazione e inizializzazione simultanea di map
n := map[string]int{"foo": 1, "bar": 2}
fmt.Println("map:", n)
}
Le mappe sono strutture in memoria dinamica e vanno quindi allocate:
m := make(map[string]int)
Tra parentesi quadre è il tipo della chiave, oltre è il tipo del valore. In questo esempio la chiave è di tipo string
e il valore di tipo int
.
La dimensione della mappa non è determinata in fase di dichiarazione, ma si espande automaticamente.
L'allocazione avviene con un'assegnazzione:
m["k1"] = 7
Sia la chiave che il valore vengono creati al momento dell'allocazione.
La stampa di una mappa fornisce in output tutte le coppie chiave-valore.
La rimozione di un elemento avviene con la funzione delete
tramite la chiave:
delete(m, "k2")
L'accesso ad un elemento di una mappa ritorna opzionalmente un secondo valore, booleano, che indica se l'elemento di mappa è presente o no.
_, prs := m["k2"]
In questo esempio il valore viene ignorato, ma è obbligatorio indicarlo con un underscore.
L'allocazione e inizializzazione di una mappa possono essere combinate con la sintassi:
n := map[string]int{"foo": 1, "bar": 2}
La sintassi è simile a JSON.