Maison >développement back-end >Golang >Comment puis-je mapper efficacement les balises aux URL d'images à l'aide de pointeurs dans Go tout en garantissant un garbage collection approprié ?
Garbage Collecte et utilisation correcte des pointeurs dans Go
Problème :
Vous êtes vous travaillez avec un langage avec une structure de données différente, comme Python, et vous souhaitez migrer vers Go. Vous ne savez pas comment exploiter correctement les pointeurs dans un programme Go.
Plus précisément, vous vous trouvez dans une situation où :
Question :
Comment utiliser efficacement les pointeurs pour mapper les balises aux URL d'images dans un programme Go ? Quelles considérations doivent être prises pour garantir une bonne collecte des ordures et une bonne gestion de la mémoire ?
Réponse :1. Évitez de stocker des pointeurs vers des champs :
2. Les valeurs de chaîne se comportent comme des pointeurs :
3. Utilisez un interne de chaîne :
Exemple de code :
<code class="go">package main import ( "encoding/json" "fmt" "os" "reflect" ) type Image struct { URL string Description string Tags []*Tag } type Tag struct { Name string Rank int } // this function mimics json.NewDecoder(resp.Body).Decode(&parsedJSON) func searchImages() []*Image { parsedJSON := []*Image{ &Image{ URL: "https://c8.staticflickr.com/4/3707/11603200203_87810ddb43_o.jpg", Description: "Ocean islands", Tags: []*Tag{ &Tag{"ocean", 1}, &Tag{"water", 2}, &Tag{"blue", 3}, &Tag{"forest", 4}, }, }, &Image{ URL: "https://c3.staticflickr.com/1/48/164626048_edeca27ed7_o.jpg", Description: "Bridge over river", Tags: []*Tag{ &Tag{"bridge", 1}, &Tag{"river", 2}, &Tag{"water", 3}, &Tag{"forest", 4}, }, }, } return parsedJSON } func main() { result := searchImages() cache := map[string]string{} tagToUrlMap := make(map[string][]string) for _, image := range result { imageURL := intern(image.URL, cache) for _, tag := range image.Tags { tagName := intern(tag.Name, cache) tagToUrlMap[tagName] = append(tagToUrlMap[tagName], imageURL) } } cache = nil enc := json.NewEncoder(os.Stdout) enc.SetIndent("", " ") if err := enc.Encode(tagToUrlMap); err != nil { panic(err) } } func intern(s string, cache map[string]string) string { if s2, ok := cache[s]; ok { return s2 } // New string, store it cache[s] = s return s }</code>
Ressources supplémentaires :
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!