Manipulasi rentetan dalam Go, tidak seperti bahasa seperti Python atau Ruby , melibatkan pengendalian penunjuk kepada data rentetan. Dalam contoh kod yang disediakan, kami menyasarkan untuk membuat struktur data memetakan teg imej kepada senarai URL imej. Walau bagaimanapun, pendekatan naif melibatkan penyalinan nilai rentetan mengikut nilai, yang boleh membawa kepada ketidakcekapan memori jika struktur data bertambah besar.
Penyelesaian awal menggunakan penunjuk ke URL Imej rentetan dan bukannya menyalinnya mengikut nilai. Walau bagaimanapun, pendekatan ini mempunyai had:
Untuk mencapai penggunaan memori yang optimum, kita perlu mempertimbangkan bahawa nilai rentetan dalam Go pada dasarnya adalah penunjuk. Menyimpan nilai rentetan menyalin struct 16-bait, tanpa mengira panjangnya. Menggunakan kumpulan rentetan atau "interners" membolehkan kami menjejaki kejadian rentetan dan menggunakan semula deskriptor rentetan sedia ada dan bukannya membuat yang baharu.
Penyelesaian kami termasuk interner rentetan ringkas yang menyimpan cache rentetan nilai dan mengembalikan deskriptor sedia ada apabila pendua ditemui. Dengan rentetan "interning", kami memastikan bahawa semua kejadian nilai rentetan yang sama menghala ke deskriptor rentetan tunggal, meminimumkan penggunaan memori.
Kod yang terhasil berikut:
<code class="go">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</code>
Penyelesaian ini meminimumkan penggunaan memori dengan menggunakan interning rentetan tanpa memperkenalkan kerumitan yang berlebihan.
Atas ialah kandungan terperinci Bagaimanakah String Interning Mengoptimumkan Penggunaan Memori dalam Struktur Data Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!