Go 使用垃圾收集器来自动管理内存。垃圾收集器会释放不再被任何指针引用的内存。
在 Go 中,字符串是按值传递的不可变值。当函数接收字符串时,它接收的是字符串值的副本,而不是对原始字符串的引用。
在提供的代码中,映射代码的以下版本不是最佳的。
版本 1:
tagToUrlMap := make(map[string][]*string) for _, image := range result { for _, tag := range image.Tags { tagToUrlMap[tag.Name] = append(tagToUrlMap[tag.Name], &image.URL) } }
版本 2:
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) } }
问题:
最佳解决方案是使用以下代码:
tagToUrlMap := make(map[string][]string) for _, image := range result { imageURL := image.URL // Store the string value directly for _, tag := range image.Tags { tagName := tag.Name // Store the string value directly tagToUrlMap[tagName] = append(tagToUrlMap[tagName], imageURL) } }
此代码为遇到的每个 URL 和标记名称创建一个新字符串。为了进一步优化内存使用,可以使用字符串驻留。
字符串驻留涉及在中央缓存中存储唯一的字符串值。当遇到新字符串时,会根据缓存进行检查。如果字符串已经在缓存中,则使用缓存的值而不是创建新字符串。
这是一个简单的字符串内部函数:
var cache = map[string]string func intern(s string) string { if s2, ok := cache[s]; ok { return s2 } cache[s] = s return s }
要使用内部函数,请修改映射代码如下:
tagToUrlMap := make(map[string][]string) for _, image := range result { imageURL := intern(image.URL) // Intern the string for _, tag := range image.Tags { tagName := intern(tag.Name) // Intern the string tagToUrlMap[tagName] = append(tagToUrlMap[tagName], imageURL) } }
要释放interner缓存使用的内存,请在interning完成后将nil分配给缓存变量:
cache = nil
通过直接使用字符串值、字符串实习以及清除实习者的缓存,您可以在 Go 程序中实现最佳的内存使用和高效的垃圾收集。
以上是使用字符串和指针时,如何优化 Go 程序中的内存使用和垃圾收集?的详细内容。更多信息请关注PHP中文网其他相关文章!