ホームページ >バックエンド開発 >Golang >Go でスライスを効率的にディープコピーするにはどうすればよいですか?

Go でスライスを効率的にディープコピーするにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-09 18:15:151035ブラウズ

How to Efficiently Deep Copy a Slice in Go?

Go でのスライスのディープ コピー

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。