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