Go slice深拷贝和浅拷贝

参考解析

深拷贝:拷贝的是数据本身,创造一个新对象,新创建的对象与原对象不共享内存,新创建的对象在内存中开辟一个新的内存地址,新对象值修改时不会影响原对象值

实现深拷贝的方式:

  1. copy(slice2, slice1)

  2. 遍历append赋值

  1. func main() {
  2. slice1 := []int{1, 2, 3, 4, 5}
  3. slice2 := make([]int, 5, 5)
  4. fmt.Printf("slice1: %v, %p
  5. ", slice1, slice1)
  6. copy(slice2, slice1)
  7. fmt.Printf("slice2: %v, %p
  8. ", slice2, slice2)
  9. slice3 := make([]int, 0, 5)
  10. for _, v := range slice1 {
  11. slice3 = append(slice3, v)
  12. }
  13. fmt.Printf("slice3: %v, %p
  14. ", slice3, slice3)
  15. }
  16. slice1: [1 2 3 4 5], 0xc0000b0030
  17. slice2: [1 2 3 4 5], 0xc0000b0060
  18. slice3: [1 2 3 4 5], 0xc0000b0090

浅拷贝:拷贝的是数据地址,只复制指向的对象的指针,此时新对象和老对象指向的内存地址是一样的,新对象值修改时老对象也会变化

实现浅拷贝的方式:

引用类型的变量,默认赋值操作就是浅拷贝

  1. slice2 := slice1
  1. func main() {
  2. slice1 := []int{1, 2, 3, 4, 5}
  3. fmt.Printf("slice1: %v, %p
  4. ", slice1, slice1)
  5. slice2 := slice1
  6. fmt.Printf("slice2: %v, %p
  7. ", slice2, slice2)
  8. }
  9. slice1: [1 2 3 4 5], 0xc00001a120
  10. slice2: [1 2 3 4 5], 0xc00001a120