ホームページ >バックエンド開発 >Golang >Go でスライスをディープ コピーする方法: 追加かコピーか?

Go でスライスをディープ コピーする方法: 追加かコピーか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-01 03:44:10683ブラウズ

How to Deep Copy a Slice in Go: Append vs. Copy?

Go でスライスを簡潔かつ効率的にディープ コピーする方法

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

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