Golang 如何将一个切片复制到另一个切片
切片是一种可变长度的序列,可存储相似类型的元素,不允许在同一切片中存储不同类型的元素。在切片中,您可以使用Go语言提供的 copy() 函数将一个切片复制到另一个切片。或者换句话说,copy()函数允许您将一个切片的元素复制到另一个切片中。
语法:
func copy(dst, src []Type) int
在这里, dst 表示目标切片, src 表示源切片。它将返回被复制的元素数,即 len(dst) 或 len(src) 的最小值。让我们通过以下示例进行讨论:
示例1:
// Go程序展示如何使用
//copy函数将切片复制到另一个切片
package main
import "fmt"
// Main方法
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 是源切片。当我们尝试将 slc1 切片复制到空的 slc2 切片中时,复制方法将返回源切片和目标切片长度的最小值,在空切片 slc2 中最小值为 0。
- copy_2:= copy(slc3, slc1): 在这里, slc3 是目标切片, slc1 是源切片。当我们尝试使用 copy() 函数将 slc1 切片复制到空的 slc3 切片中时,它仅复制了从 index 0 开始的 5 个元素,因为该切片的长度为 5,所以它无法存储大于 5 的元素。
- copy_3:= copy(slc4, slc1): 在这里, slc4 是目标切片, slc1 是源切片。当我们试图使用 copy() 函数将 slc1 切片复制到 slc4 切片中时,它只复制了从 index 0 开始的 4 个元素。这是因为 slc4 切片的长度为 4,所以它无法存储大于 4 的元素。
- copy_4:= copy(slc1, slc4): 在此之后,您可能会被输出所迷惑。请注意,代码行中的 slc4 已经更新。现在考虑更新后的值作为 slc4 的值。现在, slc4 有 4 个元素, slc1 有 9 个元素。所以,复制的总元素数量为 4。
示例 2:
// Go 程序演示如何使用 copy 函数将一个切片复制到另一个切片中
package main
import "fmt"
func main() {
// 源切片
slice_1: = [] string {"Geeks", "for", "Geeks", "GFG"}
// 使用 make 函数创建目标切片
slice_2: = make([] string, 3)
// 复制之前
fmt.Println("Slice_1: ", slice_1)
fmt.Println("Slice_2: ", slice_2)
// 使用 copy 函数将 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 函数复制切片
// 请查看代码
Copy_2: = copy(slice_1, [] string {"123geeks", "gfg"})
fmt.Println("\nSlice_1: ", slice_1)
fmt.Println(
"复制的元素数量: ",
Copy_2)
}
输出结果:
Slice_1: [Geeks for Geeks GFG]
Slice_2: [ ]
Slice_1: [Geeks for Geeks GFG]
Slice_2: [Geeks for Geeks]
复制的元素数量: 3
Slice_1: [123geeks gfg Geeks GFG]
复制的元素数量: 2
在 Go 中,要将一个切片复制到另一个切片中,可以使用内置函数 copy。copy 函数接受两个参数:目标切片和源切片,并将源切片的元素复制到目标切片中。
这是一个演示如何在 Go 中将一个切片复制到另一个切片的示例:
package main
import "fmt"
func main() {
source := []int{1, 2, 3, 4, 5}
destination := make([]int, len(source))
copy(destination, source)
fmt.Println("Source: ", source)
fmt.Println("Destination: ", destination)
}
输出 :
源数组: [1 2 3 4 5]
目标数组: [1 2 3 4 5]
在这个例子中,通过1、2、3、4、5创建了一个切片源(source)。通过调用make函数创建的slice目标数组(destination) 与源slice长度相同,并初始化为0。然后调用copy函数,以目标数组和源数组作为参数,将元素从源数组复制到目标数组。
重要提示,目标数组的长度必须等于或大于源数组的长度,否则copy函数会出错。如果目标数组的长度大于源数组的长度,则目标数组中剩余的元素将保持不变。
切片复制是Go中常见的操作,copy函数提供了一种简单高效的方式来复制切片。 它在Go程序中广泛应用,用于将切片复制为多种目的。