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) } }
String Interning
此程式碼為遇到的每個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) } }
清除快取
cache = nil
結論
透過直接使用字串值、字串實習以及清除實習者的緩存,您可以在Go 程式中實現最佳的記憶體使用和高效的垃圾收集。以上是使用字串和指標時,如何優化 Go 程式中的記憶體使用和垃圾收集?的詳細內容。更多資訊請關注PHP中文網其他相關文章!