ホームページ > バックエンド開発 > Golang > Go で空の宛先スライスにコピーすると、`copy()` が空のスライスを返すのはなぜですか?

Go で空の宛先スライスにコピーすると、`copy()` が空のスライスを返すのはなぜですか?

Mary-Kate Olsen
リリース: 2024-12-16 09:14:14
オリジナル
736 人が閲覧しました

Why Does `copy()` Return an Empty Slice When Copying to an Empty Destination Slice in Go?

copy() で空のスライスをコピーすると空のスライスになる理由

Go でスライスを操作する場合、copy() 関数既存のスライスのコピーを作成するためによく使用されます。ただし、宛先スライスが空の場合、コピー操作は予期しない動作をします。

copy() のドキュメントによると、

The copy built-in function copies elements from a source slice into a destination slice. (As a special case, it also will copy bytes from a string to a slice of bytes.) The source and destination may overlap. Copy returns the number of elements copied, which will be the minimum of len(src) and len(dst).
ログイン後にコピー

これは、コピーされる要素の数がソーススライスと宛先スライスの長さの最小値。ただし、宛先スライスが空の場合 (tmp が空のスライスとして初期化される例のように)、要素はコピーされません。

この動作の理由は、copy() の実装にあります。この関数は、ソース スライスを反復処理し、ソース スライスまたは宛先スライスの末尾に到達するまで要素を宛先スライスにコピーします。宛先スライスが空の場合、コピーする要素がないため、ループはすぐに終了します。

スライスの空でないコピーを作成するには、宛先スライスをゼロ以外の長さで初期化する必要があります。これは、次の例に示すように、make() 関数を使用して実現できます。

arr := []int{1, 2, 3}
tmp := make([]int, len(arr))
copy(tmp, arr)

fmt.Println(tmp) // Output: [1 2 3]
ログイン後にコピー

宛先スライスの長さを明示的に設定することで、copy() にはすべてのスライスをコピーするのに十分なスペースが確保されます。ソーススライスからの要素。この動作は Go 言語仕様にも記載されており、コピーされる要素の数はコピー元スライスとコピー先スライスの長さの最小値であると記載されています。

したがって、copy( を使用して空のスライスをコピーしようとすると、 )、コピー操作が確実に成功するように、宛先スライスをゼロ以外の長さで初期化することが重要です。

以上がGo で空の宛先スライスにコピーすると、`copy()` が空のスライスを返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート