Skip to main content

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"}])