浅拷贝和深拷贝

  • 浅拷贝后的对象和源对象是同一个对象,值被修改,原值的数据也会被修改
  • 深拷贝后的对象,是一个全新的对象,和源对象没有关系,修改值不会相互影响

浅拷贝示例

package main

import (
    "fmt"
)

func main() {
    a := []int{1, 2, 3, 4, 5}

    // 浅拷贝
    b := a

    // 修改 b 的第一个元素
    b[0] = 100

    // 发现 a 的第一个元素也被修改了
    fmt.Println(a) // [100 2 3 4 5]
    fmt.Println(b) // [100 2 3 4 5]
}

深拷贝示例,使用内建函数copy实现

package main

import (
    "fmt"
)

func main() {
    a := []int{1, 2, 3, 4, 5}

    // 深拷贝
    b := make([]int, len(a))

    copy(b, a)

    // 修改 b 的第一个元素
    b[0] = 100

    // 可以看到 a 的值并没有被修改
    fmt.Println(a) // [1 2 3 4 5]
    fmt.Println(b) // [100 2 3 4 5]
}