Go 言語では、copy() を使用してスライスをコピーします。1 つの配列スライスを別の配列スライスにコピーできます。追加された 2 つの配列スライスのサイズが同じでない場合は、小さい方が使用されます。配列スライス内の要素の数がコピーされます。構文は「copy(データ元スライス, コピー先スライス)」です。 copy() 関数を使用してスライスをコピーする場合、ソース スライスの長さが宛先スライスの長さよりも長い場合、コピーは不完全になります。
このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。
Go 言語の組み込み関数 copy() は、1 つの配列スライスを別の配列スライスにコピーできます。追加された 2 つの配列スライスのサイズが同じでない場合は、小さい方の配列スライスの要素が使用されます。コピー。
Go 言語の copy(): スライス コピー (スライス コピー)
Go 言語のスライス コピーは、組み込みの copy() 関数を使用します。 copy() 関数を使用してスライスをコピーする場合、ソース スライスの長さが宛先スライスの長さよりも長い場合、コピーは不完全になります。
copy() 関数の使用形式は次のとおりです。
copy( destSlice, srcSlice []T) int
srcSlice はデータ ソース スライス
destSlice はコピー先です (つまり、srcSlice を destSlice にコピーします)
ターゲット スライスにはスペースが割り当てられており、コピーされた要素の数を保持するのに十分な大きさである必要があり、ソースとターゲットの型は一貫している必要があります
戻り値:
# は、実際にコピーされた要素の数を示します。
説明
スライス src をスライス dst にコピーし、コピーに成功した要素の数を返します。スライス src の長さが dst スライスの長さより大きい場合、dst スライスの長さの要素のみがコピーされます。
次のコードは、copy() 関数を使用して、あるスライスを別のスライスにコピーするプロセスを示しています。
slice1 := []int{1, 2, 3, 4, 5} slice2 := []int{5, 4, 3} copy(slice2, slice1) // 只会复制slice1的前3个元素到slice2中 copy(slice1, slice2) // 只会复制slice2的3个元素到slice1的前3个位置
ループを介してスライス要素をコピーする方が簡単ですが、組み込みの copy() 関数の方が使いやすいです。copy() 関数の最初のパラメータはコピーされるターゲット スライスで、2 番目のパラメータはソース スライスです。2 つのスライスは同じ基礎となる配列を共有できます。重複があっても質問がございます。
ケース
1. コードを使用して、スライス要素のスライス要素に対する参照およびコピー操作の影響を示します。
package main import "fmt" func main() { // 设置元素数量为1000 const elementCount = 1000 // 预分配足够多的元素切片 srcData := make([]int, elementCount) // 将切片赋值 for i := 0; i < elementCount; i++ { srcData[i] = i } // 引用切片数据 refData := srcData // 预分配足够多的元素切片 copyData := make([]int, elementCount) // 将数据复制到新的切片空间中 copy(copyData, srcData) // 修改原始数据的第一个元素 srcData[0] = 999 // 打印引用切片的第一个元素 fmt.Println(refData[0]) // 打印复制切片的第一个和最后一个元素 fmt.Println(copyData[0], copyData[elementCount-1]) // 复制原始数据从4到6(不包含) copy(copyData, srcData[4:6]) for i := 0; i < 5; i++ { fmt.Printf("%d ", copyData[i]) } }
コードの説明は次のとおりです。
8 行目では、要素の合計数を 1000 と定義しています。
行 11、1000 要素の整数スライスを事前に割り当てます。このスライスは元のデータとして使用されます。
14 行目から 16 行目では、srcData に 0 から 999 までの整数値を入力します。
行 19、refData は srcData を参照しており、等号演算によりスライスは要素をコピーしません。
行 22、srcData と同じサイズ (等しいサイズ) および型のスライス copyData を事前に割り当てます。
24 行目では、copy() 関数を使用して、元のデータを copyData スライス スペースにコピーします。
27 行目、元のデータの最初の要素を 999 に変更します。
30 行目で、参照データの最初の要素が変更されます。
33行目はコピーしたデータの最初のデータを出力していますが、コピーしたデータなので変更はありません。
36行目、srcDataのローカルデータをcopyDataにコピーします。
行 38 ~ 40 では、ローカル データをコピーした後、copyData 要素を出力します。
#2. ソース スライスの長さが宛先スライスの長さよりも長い場合、コピーは不完全です
package main import ( "fmt" ) func main() { //当源切片的长度大于目的切片长度时,复制不完整 var sliceSrc = []string{"PHPCN", "Python", "Golang"} var sliceDst = []string{"Hello", "HaiCoder"} copy(sliceDst, sliceSrc) fmt.Println("sliceDst =", sliceDst) }
[関連する推奨事項:Go ビデオ チュートリアル 、プログラミング教育 ]
以上がGo言語でcopy()を使う方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。