go切片深拷贝

259 阅读1分钟

注释为打印结果

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的值。