English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Golang 基礎トレーニング

Golang 制御文

Golang ファンクション & メソッド

Golang 構造体

Golang スライス & 配列

Golang 文字列(String)

Golang ポインタ

Golang インターフェース

Golang 并行

Golang 異常(Error)

Golang その他の雑項

Go 言語のスライスコピー

スライスは似たようなタイプのストレージ要素であり、異なるタイプの要素は同じ可変長のシーケンスに格納することは許可されていません。スライスでは、Go言語が提供するcopy()関数スライスを別のスライスにコピーします。つまり、copy()関数を使用して、スライスの要素を別のスライスにコピーすることができます。

文法:

func copy(dst, src []Type) int

ここでは、ターゲットスライスを表し、srcソーススライスを表します。それはコピーする要素の数を返し、その数はlen(dst)またはlen(src)最小値。以下の给定の例を用いて、その使用方法を説明しましょう:

package main
import "fmt"
func main() {
    //スライスの作成
    slc1 := []int{58, 69, 40, 45, 11, 56, 67, 21, 65}
    var slc2 []int
    slc3 := make([]int, 5)
    slc4 := []int{78, 50, 67, 77}
    //コピー前に
    fmt.Println("Slice_1:", slc1)
    fmt.Println("Slice_2:", slc2)
    fmt.Println("Slice_3:", slc3)
    fmt.Println("Slice_4:", slc4)
    //スライスをコピーします
    copy_1 := copy(slc2, slc1)
    fmt.Println("\nスライス:", slc2)
    fmt.Println("コピーされる要素の総数:", copy_1)
    copy_2 := copy(slc3, slc1)
    fmt.Println("\nスライス:", slc3)
    fmt.Println("コピーされる要素の総数:", copy_2)
    copy_3 := copy(slc4, slc1)
    fmt.Println("\nスライス:", slc4)
    fmt.Println("コピーされる要素の総数:", copy_3)
    //ここで混同しないように、上記の
    //slcをコピーしました4のソースコード行
    //そのため、永続的な変更を行う、つまり
    // slc 4を含む[58 69 40 45]
    copy_4 := copy(slc1, slc4)
    fmt.Println("\nスライス:", slc1)
    fmt.Println("コピーされる要素の総数:", copy_4)
}

出力:

Slice_1: [58 69 40 45 11 56 67 21 65]
Slice_2: []
Slice_3: [0 0 0 0 0]
Slice_4: [78 50 67 77]
スライス: []
コピーされる要素の総数: 0
スライス: [58 69 40 45 11]
コピーされる要素の総数: 5
スライス: [58 69 40 45]
コピーされる要素の総数: 4
スライス: [58 69 40 45 11 56 67 21 65]
コピーされる要素の総数: 4

使用方法:上記の例では、4つの整数型のスライスがあり、それらに対してコピー操作を実行しています:

  • copy 1:= copy(slc2, slc1):ここでは、slc2はターゲットスライスであり、1はソーススライスです。ここでは、slc2スライスの中でslc1スライスをコピーする際に、slc2がnilのスライスである場合、copyメソッドはソーススライスとターゲットスライスの最小の長さを返します。2、最小の長さが0です。

  • copy_2:= copy(slc3、slc1):ここでは、slc3はターゲットスライスであり、1はソーススライスです。 ここでは、slc3スライスが空のスライスであるため、copy()関数を使用して1スライスを3スライスを5からスライスをコピーする際に、そのスライスの長さが1スライスがコピーされました5個の要素をコピーできます、因为そのスライスの長さが5、したがって、 を保存できません5の要素です。

  • copy_3:= copy(slc4、slc1):ここでは、slc4はターゲットスライスであり、slc1はソーススライスです。copy()関数を使用してslc1 スライスをslc4 をコピーする際に、それがインデックス0から始まり、その中の4個の要素です。slcslc4 スライスの長さが4、したがって、それ以上の要素を保存できません4の要素です。

  • copy_4:= copy(slc1、slc4):ここでは、出力後、混乱を感じることがあります。上記のコード行のslc4を考慮します4が更新されました。したがって、現在のslc4個の要素がありますが、slc4の更新値です。したがって、現在のslc1個の要素がありますが、slc9個の要素があります。したがって、コピーする要素の合計数は4。

例2:

package main 
  
import "fmt"
  
func main() { 
  
    //ソーススライス
    slice_1 := []string{"w3codeboxs", "for", "w3codeboxs", "GFG"} 
  
    //ターゲットスライスを作成します,make関数を使用します
    slice_2 := make([]string, 3) 
  
    //コピー前
    fmt.Println("Slice_1: ", slice_1) 
    fmt.Println("Slice_2: ", slice_2) 
  
    //にコピーします1をslice_2
    Copy_1 := copy(slice_2, slice_1) 
    fmt.Println("\nSlice_1: ", slice_1) 
    fmt.Println("Slice_2: ", slice_2) 
    fmt.Println("コピーされた要素数: ", Copy_1) 
  
        //スライスをコピーします
        //コピー機能を使用します
        //コードが明確に見えます
    Copy_2 := copy(slice_1, []string{"123w3codeboxs", "gfg"}) 
    fmt.Println("\nSlice_1 : ", slice_1) 
    fmt.Println("コピーされた要素数:", Copy_2)   
}

出力:

Slice_1:  [w3codeboxs for w3codeboxs GFG]
Slice_2:  [  ]
Slice_1:  [w3codeboxs for w3codeboxs GFG]
Slice_2:  [w3codeboxs for w3codeboxs]
コピーされた要素数:  3
Slice_1:  [123w3codeboxs gfg w3codeboxs GFG]
コピーされた要素数: 2