Go では、スライスをコピーするには、元の配列への意図しない変更を防ぐために新しいバッキング配列を作成することを考慮する必要があります。 。これを実現するには、簡潔でパフォーマンスの高い方法がいくつかあります。
1 つの方法は、append 関数を使用することです。
copy := append([]T{}, orig...)
ここで、T は元のスライス原点の要素タイプです。ただし、組み込みのコピー関数を使用した代替ソリューションが存在します。
cpy := make([]T, len(orig)) copy(cpy, orig)
コピー関数は、言語内でスライスをコピーするために最適化されています。 Go ドキュメントより:
「コピー組み込み関数は、ソース スライスから宛先スライスに要素をコピーします。 ... Copy はコピーされた要素の数を返します。これは len(src) の最小値になります。および len(dst)。"
注:
これらのソリューションでは値がコピーされることを覚えておくことが重要です。 スライス。スライスにポインタまたはポインタ フィールドを持つ構造体が含まれている場合、それらのポインタは元のスライスと同じ値を指します。
ベンチマーク:
追加とコピーのテストこれらのアプローチは同様のパフォーマンス特性を明らかにします:
BenchmarkCopy 100000 24724 ns/op BenchmarkAppend 100000 24967 ns/op
ベンチマークの結果は、どちらの方法もディープ コピーの効率が同等であることを示唆しています。スライス。
以上がGo でスライスをディープ コピーする方法: 追加かコピーか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。