Maps
Définition
Structure associant des clés à des valeurs
On peut mettre en clé tout ce qui est comparable (on peut mettre une structure comme clé)
Syntaxe
La syntaxe “longue” de déclaration d’une map est la suivante :
var m map[KeyType]ValueType
---------------------------
var m map[string]int = make(map[string]int)
Grâce à l’inférence des types à la déclaration, on peut encore simplifier cette syntaxe en :
m2 := make(map[string]int)
Opérations
Pour ces exemples, nous avons une map qui a pour clé une chaine de caractère et pour valeur un entier.
myMap := make(map[string]int)
On peut récupérer la taille de map en utilisant une fonction que nous connaissons depuis les slices len()
fmt.Printf("Map size %v\n", len(myMap))
Assignation
L’assignation et très simple, trèèèèès simple !
myMap["hello"] = 5
myMap["goodbye"] = 10
Récupération
Pour récupérer la valeur, comme pour l'assignation, il suffit de faire comme avec un tableau
fmt.Printf("key=hello, value=%v\n", myMap["hello"])
Présence d’une clé
Pour tester la présence, on utilise le retour multiple caché dans la récupération d’une valeur
j, isPresent := myMap["helo"]
fmt.Printf("j=%v, isPresent =%v\n", j, isPresent )
isPresent
est un type booléen et est égale à false
si la clé n’existe pas.
Dans le cas où la clé n’existe pas, la valeur sera celle par défaut du type (0 pour un entier, chaine vide pour une chaine de caractères, ...)
Si on souhaite mettre ce test dans une condition, on peut faire de cette manière :
if _, present = myMap["hel"]; present {
// ... code
}
Supprimer une clé / valeur
On utilise la fonction delete
delete(myMap, "hello")
Assignation rapide et parcours
On peut assigner des valeurs dans notre map dès la déclaration comme avec les tableaux
myMap := map[string]int{
"Noé": 10,
"Paul": 15,
"Swann": 18,
"Nathanael" : 0
}
Pour parcourir une map, on peut utiliser range
for name, idk := range myMap{
fmt.Printf("name=%v, idk=%v\n", name, idk)
}
// Only keys
for name := range m {
fmt.Printf("name=%v\n", name)
}
Map & Struct
Pour illustrer la mise en place d’une map constitué de structures, on va utiliser les structures suivantes
type User struct {
name string
}
type Key struct {
ID int
Name string
}
On peut créer une map de cette manière :
myMap := make(map[Key]User)
myMap[Key{1,"ceo"}] = User{"Swann"}
fmt.Printf("%v"), myMap[Key{1,"ceo"}])
Lorsqu’on récupère une structure depuis une map, on récupère en réalité une copie de cette dernière. Pour palier à ça on peut transformer notre map en une map de pointeurs
myMap := make(map[Key]*User)
myMap[Key{1,"ceo"}] = &User{"Swann"}
fmt.Printf("%v"), *myMap[Key{1,"ceo"}])