Maison > Article > développement back-end > Comment puis-je gérer efficacement l'utilisation de la mémoire et empêcher la création de déchets lorsque je travaille avec des pointeurs et un garbage collection dans Go ?
En Python, Ruby et JavaScript, les pointeurs fonctionnent différemment qu'en Go. Le garbage collector de Go libère automatiquement de la mémoire, ce qui rend essentiel la compréhension de l'utilisation du pointeur pour optimiser la consommation de mémoire et éviter la création de mémoire inutile.
Considérez l'API fictive qui renvoie un ensemble de données d'images avec les balises associées. Notre objectif est de créer une structure de données qui mappe chaque balise à une liste d'URL d'images correspondantes :
<code class="python">{ "ocean": [ "https://c8.staticflickr.com/4/3707/11603200203_87810ddb43_o.jpg" ], "water": [ "https://c8.staticflickr.com/4/3707/11603200203_87810ddb43_o.jpg", "https://c3.staticflickr.com/1/48/164626048_edeca27ed7_o.jpg" ], ... }</code>
Une façon de représenter ce mappage consiste à utiliser des pointeurs. à l'URL de la structure Image field :
<code class="go">tagToUrlMap := make(map[string][]*string) for _, image := range result { for _, tag := range image.Tags { tagToUrlMap[tag.Name] = append(tagToUrlMap[tag.Name], &image.URL) } }</code>
Résultat :
Une approche alternative consiste à utiliser une variable intermédiaire et à stocker un pointeur vers elle :
<code class="go">tagToUrlMap := make(map[string][]*string) for _, image := range result { imageUrl = image.URL for _, tag := range image.Tags { tagToUrlMap[tag.Name] = append(tagToUrlMap[tag.Name], &imageUrl) } }</code>
Résultat :
Une autre option consiste à utiliser un pointeur vers une chaîne dans la structure de l'image :
<code class="go">type Image struct { URL *string Description string Tags []*Tag }</code>
Considérations :
La solution optimale pour l'efficacité de la mémoire consiste à utiliser l'internement de chaînes, qui garantit un seul une instance d'une valeur de chaîne unique existe dans mémoire.
<code class="go">var cache = map[string]string{} func interned(s string) string { if s2, ok := cache[s]; ok { return s2 } cache[s] = s return s }</code>
Implémentation :
<code class="go">tagToUrlMap := make(map[string][]string) for _, image := range result { imageURL := interned(image.URL) for _, tag := range image.Tags { tagName := interned(tag.Name) tagToUrlMap[tagName] = append(tagToUrlMap[tagName], imageURL) } }</code>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!