Dalam Go, penunjuk digunakan untuk merujuk data yang disimpan dalam ingatan tanpa menyalin data itu sendiri. Ini boleh meningkatkan prestasi dan kecekapan ingatan, terutamanya apabila bekerja dengan struktur data yang besar atau kompleks.
Kod yang disediakan bertujuan untuk mencipta struktur data yang memetakan tag ke senarai URL imej . Walau bagaimanapun, reka bentuk awal dipertimbangkan menggunakan penunjuk untuk menyimpan memori, yang menimbulkan persoalan tentang pembersihan memori yang diperuntukkan.
Versi 1:
Versi 2:
Pendekatan paling cekap untuk menyimpan URL ialah menggunakan nilai rentetan secara langsung tanpa penunjuk. Go sudah mengoptimumkan pengendalian rentetan dengan menyimpan rentetan menggunakan kolam rentetan, yang membenarkan berbilang rujukan kepada rentetan yang sama untuk berkongsi peruntukan memori tunggal.
Untuk lebih menjimatkan ingatan, kod boleh menggunakan interning rentetan. Ia melibatkan hanya menyimpan satu tika rentetan dan merujuknya apabila rentetan yang sama ditemui.
Kod yang disediakan termasuk fungsi interning rentetan ringkas (interned()) yang menggunakan cache untuk menyimpan dan menggunakan semula rentetan yang ditemui sebelum ini .
<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>
Atas ialah kandungan terperinci Bagaimana untuk menggunakan penunjuk secara berkesan dalam Go untuk kecekapan memori sambil mengelakkan kebocoran memori dalam struktur data?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!