Maps

Map1

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.