Go 中,指针用于引用存储在内存中的数据,而不需要复制数据本身。这可以提高性能和内存效率,特别是在处理大型或复杂的数据结构时。
提供的代码旨在创建一个将标签映射到图像 URL 列表的数据结构。然而,最初的设计考虑使用指针来节省内存,这引发了关于最终分配内存清理的问题。
版本 1:
版本 2:
存储 URL 最有效的方法是直接使用字符串值,而不使用指针。 Go 已经通过使用字符串池存储字符串来优化字符串处理,这允许对同一字符串的多个引用共享单个内存分配。
为了进一步节省内存,代码可以使用字符串驻留。它涉及仅存储字符串的一个实例,并在遇到相同字符串时引用它。
提供的代码包括一个简单的字符串驻留函数 (interned()),该函数使用缓存来存储和重用以前遇到的字符串.
<code class="go">package main import ( "bytes" "encoding/json" "fmt" ) type Image struct { URL string Description string Tags []Tag } type Tag struct { Name string Rank int } 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 interned(s string) string { if str, ok := cache[s]; ok { return str } cache[s] = s return s } var cache = make(map[string]string) func main() { result := searchImages() 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) } } // Clear the interner cache cache = nil // Trim allocated slices to the minimum needed for tagName, urls := range tagToUrlMap { if cap(urls) > len(urls) { urls2 := make([]string, len(urls)) copy(urls2, urls) tagToUrlMap[tagName] = urls2 } } enc := json.NewEncoder(os.Stdout) enc.SetIndent("", " ") if err := enc.Encode(tagToUrlMap); err != nil { panic(err) } }</code>
以上是如何在Go中有效地使用指针来提高内存效率,同时避免数据结构中的内存泄漏?的详细内容。更多信息请关注PHP中文网其他相关文章!