注释为打印结果
func copySlice() {
a := make([]int, 0)
for i := 0; i < 10; i++ {
a = append(a, i)
}
fmt.Println(a) //[0 1 2 3 4 5 6 7 8 9]
var b1 []int
copy(b1, a)
fmt.Println(b1) // []
b2 := make([]int, 5)
copy(b2, a)
fmt.Println(b2) // [0 1 2 3 4]
b3 := make([]int, len(a))
copy(b3,a)
fmt.Println(b3) //[0 1 2 3 4 5 6 7 8 9]
b4 := make([]int,0,len(a))
copy(b4,a)
fmt.Println(b4) // []
}
注意:b4 := make([]int,0,len(a))的打印结果是空的,所以正确用法是b2和b3。
即GO切片的复制,是从dst的第一个不为空的位置开始赋值。b3在未copy前的打印结果是[0 0 0 0 0 0 0 0 0 0],所以才会从第一个位置就被赋值。而b4声明方式表明它只是cap为10,但是所有位置都是为空的,故未成功copy到a的值。