Go 语言切片复制

切片是相似类型的存储元素,则不允许不同类型的元素的存储在同一条带的可变长度序列。在切片中,您可以使用Go语言提供的copy()函数将一个切片复制到另一个切片中。换句话说,通过copy()函数可以将一个切片的元素复制到另一切片中。

语法:

func copy(dst, src []Type) int

此处,dst表示目标切片,而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("\nSlice:", slc2)
    fmt.Println("复制的元素总数:", copy_1)

    copy_2 := copy(slc3, slc1)
    fmt.Println("\nSlice:", slc3)
    fmt.Println("复制的元素总数:", copy_2)

    copy_3 := copy(slc4, slc1)
    fmt.Println("\nSlice:", slc4)
    fmt.Println("复制的元素总数:", copy_3)

    //这里不要混淆,因为在上面
    //复制了slc4的代码行
    //并因此进行永久修改,即
    // slc 4包含[58 69 40 45]
    copy_4 := copy(slc1, slc4)
    fmt.Println("\nSlice:", 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]

Slice: []
复制的元素总数: 0

Slice: [58 69 40 45 11]
复制的元素总数: 5

Slice: [58 69 40 45]
复制的元素总数: 4

Slice: [58 69 40 45 11 56 67 21 65]
复制的元素总数: 4

用法说明:在上面的示例中,我们有四个整数类型切片,并对它们执行复制操作:

  • copy 1:= copy(slc2, slc1):在这里,slc2是目标片,slc1是源片。这里,当我们尝试在slc2片中复制slc1片时,slc2是nil切片,那么copy方法将返回源切片和目标切片的最小长度,对于空切片slc2,最小长度为0。

  • copy_2:= copy(slc3,slc1):在这里,slc3是目标切片,而slc1是源切片。 此处,slc3切片是空切片,因此当我们尝试使用copy()函数将slc1切片复制到slc3时,由于该切片的长度为5,因此它仅从slc1切片复制了5个元素,因为该切片的长度为5,因此可以 不存储大于5的元素。

  • copy_3:= copy(slc4,slc1):在这里,slc4是目标切片,而slc1是源切片。当我们尝试使用copy()函数将slc1 slice 复制到slc4 slice时,它仅从索引0开始复制其中的4个元素。由于slc4 切片 的长度为4,因此它不能存储大于4的元素。

  • copy_4:= copy(slc1,slc4):在这里,输出后可能会感到困惑。 请参见,上面的代码行中的slc4已更新。 因此,现在考虑slc4的更新值。 因此,现在slc4具有4个元素,而slc1具有9个元素。 因此,将要复制的元素总数为4。

范例2:

package main 
  
import "fmt"
  
func main() { 
  
    //源切片
    slice_1 := []string{"nhooos", "for", "nhooos", "GFG"} 
  
    //创建目标切片,使用make函数
    slice_2 := make([]string, 3) 
  
    //复制前
    fmt.Println("Slice_1: ", slice_1) 
    fmt.Println("Slice_2: ", slice_2) 
  
    //将slice_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{"123nhooos", "gfg"}) 
    fmt.Println("\nSlice_1 : ", slice_1) 
    fmt.Println("复制的元素数:", Copy_2)   
}

输出:

Slice_1:  [nhooos for nhooos GFG]
Slice_2:  [  ]

Slice_1:  [nhooos for nhooos GFG]
Slice_2:  [nhooos for nhooos]
复制的元素数:  3

Slice_1:  [123nhooos gfg nhooos GFG]
复制的元素数: 2