Go言語 copy(): スライスコピー(スライスコピー)

Go言語 copy(): スライスコピー(スライスコピー)

 
 
Go 言語の組み込み関数 copy() は、配列スライスを別の配列スライスにコピーすることができ、追加された 2 つの配列スライスのサイズが同じでない場合は、小さい方の配列スライスの要素数に応じてコピーされます。

 

copy() 関数の使用形式は次のとおりです。

copy( destSlice, srcSlice []T) int

このうち、srcSlice はデータ ソース スライスで、destSlice はコピーのターゲット (つまり、srcSlice を destSlice にコピー) です。ターゲット スライスには、コピーされた要素の数と、ソースとターゲットの数を保持するのに十分なスペースが割り当てられている必要があります。 copy() 関数の戻り値は、コピーされた要素の実際の数を示します。

次のコードは、copy() 関数を使用して 1 つのスライスを別のスライスにコピーするプロセスを示しています。

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 つのスライスを共有可能 基盤となる配列が同じで、重複していても問題ありません。

[例] スライスの参照およびコピー操作後のスライス要素への影響をコードで示します。

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)
    //データを新しいスライススペースにコピーします
    コピー(copyData、srcData)

    //元のデータの最初の要素を変更します
    srcData [0] =999

    //参照スライスの最初の要素を出力する
    fmt.Println(refData [0])

    //最初と最後の要素をコピーしたスライスを印刷します
    fmt.Println(copyData [0]、copyData [elementCount-1])

    //元のデータを4から6まで(含まれない)コピーします
    コピー(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 要素を出力します。
 

「 Go言語 copy(): スライスコピー(スライスコピー)」についてわかりやすく解説!絶対に観るべきベスト2動画

Go言語とは?|プログラミング言語のGo言語について3分でわかりやすく解説します【プログラミング初心者向け】
【たった1時間で学べる】Go言語のプログラミング初心者向けの超入門講座【文字書き起こし、ソースコードも完全無料!】