Python や Ruby などの言語とは異なり、Go での文字列操作、文字列データへのポインターの処理が含まれます。提供されたコード例では、画像タグを画像 URL のリストにマッピングするデータ構造を作成することを目的としています。ただし、単純なアプローチでは文字列値を値ごとにコピーする必要があるため、データ構造が大きくなるとメモリ効率が低下する可能性があります。
最初のソリューションでは、画像 URL へのポインタを使用します。値ごとにコピーするのではなく、文字列をコピーします。ただし、このアプローチには制限があります。
最適なメモリ使用量を実現するには、Go の文字列値は本質的にポインタであることを考慮する必要があります。文字列値を格納すると、その長さに関係なく、16 バイトの構造体がコピーされます。文字列プールまたは「インターナー」を使用すると、文字列の出現を追跡し、新しい文字列記述子を作成する代わりに既存の文字列記述子を再利用できます。
私たちのソリューションには、文字列をキャッシュする単純な文字列インターナーが含まれています値を取得し、重複が見つかった場合は既存の記述子を返します。文字列を「インターニング」することで、同じ文字列値が出現するすべてが単一の文字列記述子を指すようになり、メモリ消費が最小限に抑えられます。
結果のコードは次のとおりです。
<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>
このソリューションは、過度の複雑さを導入することなく文字列インターンを使用することでメモリ使用量を最小限に抑えます。
以上がString Interning は Go データ構造のメモリ使用量をどのように最適化できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。