Go でスライスを操作する場合、コピーへの変更が確実に反映されるようにスライスをディープ コピーする必要が生じることがあります。元のスライスには影響しません。この記事では、これを実現するための 2 つの簡潔でパフォーマンスの高い方法について説明します。
確立された手法の 1 つは、append 関数を使用することです。
copy := append([]T{}, orig...)
ただし、組み込みのコピーを使用する別の方法もあります。関数が登場しました:
cpy := make([]T, len(orig)) copy(cpy, orig)
copy 関数のドキュメントには、要素をソース スライスから宛先スライスにコピーし、必要に応じてオーバーラップすると記載されています。コピーされた要素の数を返しますが、これは両方のスライスの長さによって制限されます。
注: どちらのメソッドもスライス内の値のみをコピーします。スライスにポインタまたはポインタ フィールドを持つ構造体が含まれている場合、これらのポインタは元のスライスと同じ値を指し続けます。
ベンチマーク結果:
評価するにはこれらのメソッドのパフォーマンスについてベンチマークが実施されました:
BenchmarkCopy 100000 24724 ns/op BenchmarkAppend 100000 24967 ns/op
ご覧のとおり、両方のアプローチは非常に似ています。パフォーマンス。
アセンブリ分析:
各メソッドに対して生成されたアセンブリを調べると、どちらも runtime.growslice または runtime.makeslice のいずれかを呼び出していることがわかります。新しいスライスにはゼロ埋めが必要です。
以上がGo でスライスをディープコピーする最も簡潔でパフォーマンスの高い方法は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。