Go では、元のバッキング配列への変更を防ぐために、スライスのディープ コピーを効率的に作成することが不可欠です。一般的に使用されるアプローチの 1 つは、スライス リテラルと追加関数の使用です。
copy := append([]T{}, orig...)
ただし、組み込みのコピー関数を利用する別の方法もあります。
cpy := make([]T, len(orig)) copy(cpy, orig)
このアプローチ必要なストレージを取得し、コピー組み込み関数を使用して要素をソースから宛先に直接コピーします。ドキュメントによると:
func copy(dst, src []Type) int
The copy built-in function copies elements from a source slice into a destination slice. ... Copy returns the number of elements copied, which will be the minimum of len(src) and len(dst).
注:
どちらのメソッドも浅いコピーを実行します。つまり、スライス内のポインターまたは構造体フィールドは引き続きポイントされます。オリジナルに
ベンチマーク:
両方の手法のパフォーマンスを比較すると、同様の結果が得られます:
BenchmarkCopy 100000 24724 ns/op BenchmarkAppend 100000 24967 ns/op
これは、両方のアプローチが同等に適していることを示しています。 Go でスライスをディープコピーします。ただし、大きなスライスを扱う場合は、コピー関数のアプローチの方が若干効率的である可能性があります。
以上がGo でスライスを効率的にディープコピーするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。