In Go, map è un tipo di dato integrato che associa chiavi a valori.
In altri linguaggi di programmazione, potresti conoscere il concetto di map come dizionario, tabella hash, archivio chiave/valore o array associativo.
A livello sintattico, map si presenta così:
map[KeyType]ElementType
È anche importante sapere che ogni chiave è unica: assegnare due volte la stessa chiave sovrascriverà il valore della chiave corrispondente.
Per creare una mappa, puoi fare così:
// With map literal
foo := map[string]int{}
oppure
// or with make function
foo := make(map[string]int)
Ecco alcune operazioni che puoi fare con una mappa:
// Add a value in a map with the `=` operator:
foo["bar"] = 42
// Here we update the element of `bar`
foo["bar"] = 73
// To retrieve a map value, you can use
baz := foo["bar"]
// To delete an item from a map, you can use
delete(foo, "bar")
Se provi a recuperare il valore di una chiave che non esiste nella mappa, otterrai il valore zero del tipo di valore.
Questo può confonderti, soprattutto se il valore predefinito del tuo ElementType (per esempio, 0 per un int) è un valore valido.
Per verificare se una chiave esiste nella mappa, puoi usare
value, exists := foo["baz"]
// If the key "baz" does not exist,
// value: 0; exists: false
Un tuo amico ha un vecchio negozio all'ingrosso chiamato Gross Store. Il nome deriva dalla quantità degli articoli che il negozio vende: è tutto in unità gross. Il tuo amico ti ha chiesto di implementare un sistema di punto vendita (POS) per il suo negozio. Per prima cosa, vuoi costruirne un prototipo. Nel prototipo, il sistema registrerà solo la quantità. Il tuo amico ti ha dato un elenco di unità di misura per aiutarti:
| Unità | Valore |
|---|---|
| quarter_of_a_dozen | 3 |
| half_of_a_dozen | 6 |
| dozen | 12 |
| small_gross | 120 |
| gross | 144 |
| great_gross | 1728 |
Per poter usare l'unità di misura, devi memorizzarla nel programma.
units := Units()
fmt.Println(units)
// Output: map[...] with entries like ("dozen": 12)
Devi implementare una funzione che crei un nuovo conto (vuoto) per il cliente.
bill := NewBill()
fmt.Println(bill)
// Output: map[]
Per implementarlo, dovrai:
false se unit non è presente nella mappa units.bill del cliente, indicizzato con il nome dell'articolo, e restituire true.unit fornita.bill := NewBill()
units := Units()
ok := AddItem(bill, units, "carrot", "dozen")
fmt.Println(ok)
// Output: true (since dozen is a valid unit)
Nota che il valore restituito è di tipo
bool.
Per implementarlo, dovrai:
false se l'articolo fornito non è presente nel contofalse se unit non è presente nella mappa units.false se la nuova quantità sarebbe inferiore a 0.bill e restituire true.true.bill := NewBill()
units := Units()
ok := RemoveItem(bill, units, "carrot", "dozen")
fmt.Println(ok)
// Output: false (because there are no carrots in the bill)
Nota che il valore restituito è di tipo
bool.
Per implementarlo, dovrai:
0 e false se item non è presente nel conto.bill e true.bill := map[string]int{"carrot": 12, "grapes": 3}
qty, ok := GetItem(bill, "carrot")
fmt.Println(qty)
// Output: 12
fmt.Println(ok)
// Output: true
Nota che i valori restituiti sono di tipo
intebool.
Iscriviti a Exercism per imparare e padroneggiare Go con 34 concetti165 esercizi e il mentoring di persone reali, tutto gratis.