Rumah > Artikel > pembangunan bahagian belakang > Bagaimanakah saya boleh mengurus penggunaan memori dengan berkesan dan menghalang penciptaan sampah apabila bekerja dengan penunjuk dan pengumpulan sampah dalam Go?
Dalam Python, Ruby dan JavaScript, penunjuk berfungsi secara berbeza daripada dalam Go. Pengumpul sampah Go membebaskan memori secara automatik, menjadikannya penting untuk memahami penggunaan penunjuk untuk mengoptimumkan penggunaan memori dan menghalang penciptaan sampah yang tidak perlu.
Pertimbangkan API rekaan yang mengembalikan set data imej dengan tag yang berkaitan. Kami berhasrat untuk mencipta struktur data yang memetakan setiap teg kepada senarai URL imej yang sepadan:
<code class="python">{ "ocean": [ "https://c8.staticflickr.com/4/3707/11603200203_87810ddb43_o.jpg" ], "water": [ "https://c8.staticflickr.com/4/3707/11603200203_87810ddb43_o.jpg", "https://c3.staticflickr.com/1/48/164626048_edeca27ed7_o.jpg" ], ... }</code>
Salah satu cara untuk mewakili pemetaan ini adalah dengan menggunakan penunjuk ke medan URL struct Imej:
<code class="go">tagToUrlMap := make(map[string][]*string) for _, image := range result { for _, tag := range image.Tags { tagToUrlMap[tag.Name] = append(tagToUrlMap[tag.Name], &image.URL) } }</code>
Keputusan:
Pendekatan alternatif ialah menggunakan pembolehubah perantaraan dan menyimpan penuding kepadanya:
<code class="go">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) } }</code>
Keputusan:
Pilihan lain ialah dengan gunakan penuding kepada rentetan dalam struct Imej:
<code class="go">type Image struct { URL *string Description string Tags []*Tag }</code>
Pertimbangan:
Penyelesaian optimum untuk kecekapan memori ialah menggunakan string interning, yang memastikan hanya satu contoh nilai rentetan unik wujud dalam ingatan.
<code class="go">var cache = map[string]string{} func interned(s string) string { if s2, ok := cache[s]; ok { return s2 } cache[s] = s return s }</code>
Pelaksanaan:
<code class="go">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) } }</code>
Atas ialah kandungan terperinci Bagaimanakah saya boleh mengurus penggunaan memori dengan berkesan dan menghalang penciptaan sampah apabila bekerja dengan penunjuk dan pengumpulan sampah dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!