golang copy复制和等号复制的区别

1,534 阅读1分钟

copy函数的作用

copy函数作用: 将一个切片复制到另一个切片

func main() {
	a := []int{1,2,3}
	b := []int{}
	copy(b, a)
	fmt.Println(a, b)
}

输出结果:

[1 2 3] []

因为copy时,copy的元素个数是 min(len(src), len(dst)), []int{}声明的切片长度为0,所以只能复制0个元素。

copy函数和等号赋值的区别:

func main() {
	a := []int{1,2,3}
	b := make([]int, 3)
	copy(b, a)
	b[0] = 11
	fmt.Println(a, b)
}

输出结果:

[1 2 3] [11 2 3]

因为copy的情况下,两个slice引用的是不同的底层数组,改变一个不影响另一个。

func main() {
	a := []int{1,2,3}
	//b := make([]int, 3)
	//copy(b, a)
	b := a
	b[0] = 11
	fmt.Println(a, b)
}

输出结果:

[11 2 3] [11 2 3]

等号复制时,两个切片引用的同一个数组,改变一个会同时修改另一个。

往切片b append数据时,超出了make的容量,b会引用一个新的底层数组,改变b不影响a。

func main() {
	a := []int{1,2,3}
	b := a
	b = append(b, 4)
	b[0] = 11
	fmt.Println(a, b)
}

输出结果:

[1 2 3] [11 2 3 4]