En Go, la structure map est toujours transmise par valeur, mais cette valeur contient un pointeur vers les structures internes de la map elle-même (en coulisses — une table de hachage). Ainsi, si vous passez une map à une fonction et que vous modifiez son contenu à l'intérieur de la fonction (en ajoutant/supprimant des éléments), les modifications seront visibles à l'extérieur. Les slices se comportent de manière similaire : la structure du slice est copiée, mais pas le tableau de données lui-même : le slice contient un pointeur vers le tableau, sa longueur et sa capacité. Si vous modifiez les valeurs par indice à l'intérieur de la fonction, le tableau d'origine sera également modifié. Cependant, si vous assignez un nouveau slice depuis la fonction (par exemple, en faisant un reslicing), la variable d'origine ne changera pas.
func updateMap(m map[string]int) { m["key"] = 42 // Les changements sont visibles à l'extérieur ! } func updateSlice(s []int) { s[0] = 99 // Le tableau d'origine est modifié }
Pourquoi, lors du passage de map et de slice à une fonction, leurs modifications à l'intérieur de la fonction se reflètent-elles sur "l'original" ?
Réponse : Parce que seule la structure du pointeur est copiée, tandis que les données elles-mêmes restent communes — toute modification touche le même bloc de mémoire.
Histoire
Dans un projet fintech, une map de paramètres de configuration était transmise à différents services, supposant que les modifications locales n'affecteraient pas la map globale. En conséquence, un service a modifié des valeurs, entraînant des bugs dans d'autres modules qui ont reçu une configuration modifiée de manière inattendue.
Histoire
Dans un microservice d'analytique, un slice était transmis en pensant obtenir des copies indépendantes. Mais la fonction à l'intérieur a modifié les valeurs par indice, ce qui a conduit à des données déformées dans le rapport, car le tableau d'origine a été modifié de manière inattendue.
Histoire
Dans les serveurs de jeux, une map était utilisée pour stocker les sessions des utilisateurs et cette map était simultanément transmise à plusieurs goroutines. Il était supposé que chaque goroutine travaillait avec sa propre copie, mais en réalité, une course de données a eu lieu, entraînant des sessions partiellement perdues.