在Golang中,数组是值类型而切片是引用类型。因此值的复制与切片的复制并不相同。
数组的复制
对于值类型的数组来说,变量指向的并不是第一个元素的指针,而是整个数组。以下情况会发生数组的复制:
- 将数组变量赋值给另一个数组变量
- 将数组变量作为参数传递给方法
举个栗子:
package mainimport "fmt"func main() { sample1 := [2]string{"a", "b"} fmt.Printf("Sample1 Before: %v\n", sample1) sample2 := sample1 sample2[0] = "c" fmt.Printf("Sample1 After assignment: %v\n", sample1) fmt.Printf("Sample2: %v\n", sample2) test(sample1) fmt.Printf("Sample1 After Test Function Call: %v\n", sample1)}func test(sample [2]string) { sample[0] = "d" fmt.Printf("Sample in Test function: %v\n", sample)}
输出
Sample1 Before: [a b]Sample1 After assignment: [a b]Sample2: [c b]Sample in Test function: [d b]Sample1 After Test Function Call: [a b]
在上例中,
- 将simple1赋值给simple2后,修改simple2的第一个元素,simple1的值并没有改变。因为数组的复制是值复制,simple2的修改并不会对simple1产生影响
- 将simple1作为参数传递给test方法,在方法中修改数组第一个元素。simple1的值同样不会被改变。因为数组作为参数传入方法时发生了值复制。
切片的复制
golang的builtin
包提供的copy
方法可以用来复制切片。该方法返回成功复制元素的个数,签名如下:
func copy(dst, src []Type) int
被复制的元素个数是dst和src中短的那个。同时注意一旦复制,对dst的任何修改都不会影响到src,反之亦然。
package mainimport "fmt"func main() { src := []int{1, 2, 3, 4, 5} dst := make([]int, 5) numberOfElementsCopied := copy(dst, src) fmt.Printf("Number Of Elements Copied: %d\n", numberOfElementsCopied) fmt.Printf("dst: %v\n", dst) fmt.Printf("src: %v\n", src) //After changing numbers2 dst[0] = 10 fmt.Println("\nAfter changing dst") fmt.Printf("dst: %v\n", dst) fmt.Printf("src: %v\n", src)}
输出
Number Of Elements Copied: 5dst: [1 2 3 4 5]src: [1 2 3 4 5]After changing dstdst: [10 2 3 4 5]src: [1 2 3 4 5]
文章来源:智云一二三科技
文章标题:Golang:数组与切片的复制
文章地址:https://www.zhihuclub.com/6705.shtml