Go语言 copy()内置函数是否执行浅拷贝?[已关闭]

laawzig2  于 2023-01-10  发布在  Go
关注(0)|答案(1)|浏览(117)

这个问题是由打字错误或无法再重现的问题引起的。虽然类似的问题在这里可能是on-topic,但这个问题的解决方式不太可能帮助未来的读者。
21小时前关门了。
Improve this question
以下代码:

package main

import "fmt"

func main() {
    var src = []int{1, 2, 3, 4, 5}
    var dst []int = make([]int, 10)
    fmt.Println(&src[0]) //0xc00001c210

    dst = src // shallow copy
    fmt.Println(&dst[0]) //0xc00001c210

    copy(dst, src) // shallow copy
    fmt.Println(&dst[0]) //0xc00001c210
}

使用简单赋值和copy()内置函数执行浅拷贝
copy()内置函数的用途是什么?因为赋值操作是进行浅拷贝。

lmvvr0a8

lmvvr0a81#

您看到相同内存地址的原因是将dst片替换为src-这使copy无效。由于dstsrc片指向相同内存,因此任何修改都将影响这两个片。通常,您需要将copy指向不同的片/内存,以便可以单独修改片。
copy实际上是一个浅拷贝。它只将源切片直接引用的内存拷贝到目标切片引用的内存。它不会跟随指针并克隆其下的结构体(如果有)。
另一个例子用指针强调了这一点:

package main

import "fmt"

type data struct {
    num int
}

func main() {
    src := []*data{&data{}, &data{}}
    dst := make([]*data, 2)
    copy(dst, src)
    fmt.Printf("src: %p : %#v\n", &src[0], src)
    fmt.Printf("dst: %p : %#v\n", &dst[0], dst)
}

// Outputs:
// src: 0xc000014260 : []*main.data{(*main.data)(0xc00001c030), (*main.data)(0xc00001c038)}
// dst: 0xc000014270 : []*main.data{(*main.data)(0xc00001c030), (*main.data)(0xc00001c038)}

这表明:

  • src和dst片使用不同的内存(不同的指针)
  • 复制的结构相同(指针相同,未克隆)。

相关问题