En Go, map est un type de données intégré qui associe des clés à des valeurs.
Dans d'autres langages de programmation, tu connais peut-être le concept de map sous les noms de dictionnaire, table de hachage, magasin clé/valeur ou tableau associatif.
Syntaxiquement, map ressemble à ceci :
map[KeyType]ElementType
Il est aussi important de savoir que chaque clé est unique, ce qui signifie qu'affecter deux fois la même clé écrase la valeur de la clé correspondante.
Pour créer une map, tu peux faire :
// With map literal
foo := map[string]int{}
ou
// or with make function
foo := make(map[string]int)
Voici quelques opérations que tu peux effectuer sur une map :
// 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")
Si tu essaies de récupérer la valeur d'une clé qui n'existe pas dans la map, cela renvoie la valeur zéro du type de valeur.
Cela peut prêter à confusion, surtout si la valeur par défaut de ton ElementType (par exemple, 0 pour un int) est une valeur valide.
Pour vérifier si une clé existe dans ta map, tu peux utiliser
value, exists := foo["baz"]
// If the key "baz" does not exist,
// value: 0; exists: false
Un de tes amis tient un vieux magasin de gros appelé Gross Store. Ce nom vient de la quantité d'articles que le magasin vend : tout se compte en grosse. Ton ami t'a demandé de développer un système de point de vente (POS) pour son magasin. Pour commencer, tu veux en construire un prototype. Dans ton prototype, ton système se contentera d'enregistrer la quantité. Ton ami t'a donné une liste de mesures pour t'aider :
| Unité | Valeur |
|---|---|
| quarter_of_a_dozen | 3 |
| half_of_a_dozen | 6 |
| dozen | 12 |
| small_gross | 120 |
| gross | 144 |
| great_gross | 1728 |
Pour pouvoir utiliser ces mesures, tu dois les stocker dans ton programme.
units := Units()
fmt.Println(units)
// Output: map[...] with entries like ("dozen": 12)
Tu dois implémenter une fonction qui crée une nouvelle facture (vide) pour le client.
bill := NewBill()
fmt.Println(bill)
// Output: map[]
Pour cela, tu vas devoir :
false si la valeur de unit fournie ne figure pas dans la map units.bill du client en l'indexant par le nom de l'article, puis renvoyer true.unit.bill := NewBill()
units := Units()
ok := AddItem(bill, units, "carrot", "dozen")
fmt.Println(ok)
// Output: true (since dozen is a valid unit)
Note que la valeur renvoyée est de type
bool.
Pour cela, tu vas devoir :
false si l'article donné n'est pas dans la facturefalse si la valeur de unit fournie ne figure pas dans la map units.false si la nouvelle quantité serait inférieure à 0.bill, puis renvoyer 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)
Note que la valeur renvoyée est de type
bool.
Pour cela, tu vas devoir :
0 et false si item n'est pas présent dans la facture.bill ainsi que true.bill := map[string]int{"carrot": 12, "grapes": 3}
qty, ok := GetItem(bill, "carrot")
fmt.Println(qty)
// Output: 12
fmt.Println(ok)
// Output: true
Note que les valeurs renvoyées sont de type
intetbool.
Inscris-toi sur Exercism pour apprendre et maîtriser Go avec 34 concepts165 exercices, et un vrai mentorat humain, le tout gratuitement.