スライスの効率的なディープ コピー
Go では、スライスのディープ コピーを作成するには、その内容を別のメモリ場所に複製する必要があります。これにより、1 つのスライスに加えられた変更が他のスライスに影響を与えないことが保証されます。
ディープ コピーの 1 つのアプローチは、append 関数を使用することです。
copy := append([]T{}, orig...)
ここでは、元のスライスのオリジナルが追加されます。空のスライス。独自のバッキング配列を持つ新しいスライス コピーを作成します。
別の方法では、組み込みのコピーを使用します。 function:
cpy := make([]T, len(orig)) copy(cpy, orig)
このアプローチは、orig から新しく作成されたスライス cpy に要素を直接コピーします。
どちらのソリューションも、スライス内の値を効果的にコピーします。ただし、スライスにポインタまたはポインタ フィールドを持つ構造体が含まれている場合、これらのポインタ値は元のスライスと同じ場所を参照することに注意することが重要です。
2 つの方法のベンチマークを行うと、同等のパフォーマンスが得られます。
BenchmarkCopy 100000 24724 ns/op BenchmarkAppend 100000 24967 ns/op
アセンブリ コードは、追加とコピーの両方が、その一部としてメモリのゼロフィルを実行する可能性があることを示しています。
最終的に、追加方法とコピー方法のどちらを選択するかは、個人の設定とパフォーマンスの考慮事項によって決まります。ただし、どちらのアプローチも効果的にスライスをディープ コピーし、スライス データの個別のインスタンスを操作するときにデータの整合性を確保します。
以上がGo スライス: ディープ コピーの追加とコピー – どちらが効率的ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。