ホームページ >バックエンド開発 >Golang >Go でスライスをディープコピーする最も簡潔でパフォーマンスの高い方法は何ですか?

Go でスライスをディープコピーする最も簡潔でパフォーマンスの高い方法は何ですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-23 19:26:151006ブラウズ

What are the Most Concise and Performant Ways to Deep Copy Slices in Go?

スライスのディープ コピーの簡潔さとパフォーマンス

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

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