go语言中的深浅拷贝

在go语言中如何基于指针,以操作slice为例,编写程序说明深浅拷贝的区别

简单来说,浅拷贝只是复制指向数据的指针,而不会复制数据本身,而深拷贝则会创建一个全新的数据副本。这意味着在浅拷贝中,原始数据和拷贝数据共享同一个底层数据,而在深拷贝中,两个数据是完全独立的。

在 Go 语言中,可以通过指针来实现深拷贝和浅拷贝。下面是一个以操作 slice 为例的程序,用于演示深拷贝和浅拷贝的区别:

package main

import "fmt"

func main() {
    // 原始 slice
    original := []int{1, 2, 3, 4, 5}
    // 浅拷贝
    shallowCopy := original
    // 修改拷贝数据
    shallowCopy[0] = 10
    // 输出结果
    fmt.Println("Original:", original)
    fmt.Println("Shallow copy:", shallowCopy)

    // 深拷贝
    deepCopy := make([]int, len(original))
    copy(deepCopy, original)
    // 修改拷贝数据
    deepCopy[1] = 20
    // 输出结果
    fmt.Println("Original:", original)
    fmt.Println("Deep copy:", deepCopy)
}

在上面的程序中,我们首先创建了一个名为 original 的 slice,其中包含了五个整数。然后我们进行了浅拷贝和深拷贝操作,分别得到了 shallowCopy 和 deepCopy 这两个新的 slice。

接下来,我们修改了 shallowCopy 和 deepCopy 中的数据,分别将第一个和第二个元素的值修改为了不同的值。然后我们分别输出了原始 slice 和两个拷贝的 slice 的内容。

通过运行上面的程序,我们可以看到以下输出:

Original: [10 2 3 4 5]
Shallow copy: [10 2 3 4 5]
Original: [10 2 3 4 5]
Deep copy: [1 20 3 4 5]

可以看到,修改了浅拷贝的数据之后,原始 slice 的内容也被修改了。这是因为浅拷贝只是复制了指向底层数据的指针,两个 slice 共享同一个底层数据。

而对于深拷贝,由于创建了一个全新的数据副本,因此在修改 deepCopy 中的数据之后,原始 slice 的内容并没有被修改。

需要注意的是,在 Go 语言中,不同的数据类型可能会有不同的拷贝方式,因此在编写代码时需要仔细考虑使用哪种拷贝方式。同时,需要注意在对拷

  • 这篇文章:go语言中slice的容量和内存地址 也许能够解决你的问题,你可以看下
  • 除此之外, 这篇博客: go语言基础编程中的 向slice 添加元素 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}

    s1 := arr[2:6]   // 2, 3, 4, 5

    //s2 := s1[3:5]    //5, 6

    s2 := s1[0:2]    //2 3

     

    s2 = append(s2, 10)

    // s2 的值 56 10

    // s2 的值  2 310

    // arr 的值    0 1 2 34 5 6 10

    // arr 的值为  0 1 2 3105 6 7

     

    添加元素时,如果超越cap,系统会重新分配更大的底层数组

    由于值传递的关系,必须接收append的返回值

    s = append(s ,val)