【发布时间】:2022-01-15 23:46:45
【问题描述】:
在传递带有原始和指针字段的结构时,我深入研究了一些关于深拷贝或浅拷贝的比较。喜欢:
type Copy struct {
age int
ac *AnotherCopy
}
type AnotherCopy struct {
surname string
}
func main() {
s := Copy{
age: 20,
ac: &AnotherCopy{surname: "Relic"},
}
passIt(&s)
fmt.Printf("main s: %p\n", &s)
}
func passIt(s *Copy) {
f := *s
fmt.Printf("s: %p\n", &*s)
fmt.Printf("f: %p\n", &f)
f.age = 26
f.ac.surname = "Walker"
fmt.Printf("%v %s\n", f, f.ac.surname)
fmt.Printf("%v %s\n", *s, s.ac.surname)
}
结果是
s: 0xc000010230
f: 0xc000010250
{26 0xc000010240} Walker
{20 0xc000010240} Walker
main s: 0xc000010230
我在这里看到的是,当我们传递一个包含原始类型和复合类型的结构时,它会深度复制原始类型并浅层复制指针(引用)字段。
我已经阅读了一些关于该过程的文章,但想法之间存在冲突。
问题是我们应该怎样称呼这个过程?深拷贝还是浅拷贝? 如果我们把这个过程称为只是浅拷贝,这是错的吗? 你能澄清一下吗?
【问题讨论】:
-
这里没有“深拷贝”,go中的所有赋值都是简单的浅拷贝。我们称这个过程为“复制”
-
好吧,为什么年龄字段的变化没有反映到原始变量。浅拷贝是否意味着对 f 字段的更改也应该更改 s 的字段,就像这里解释的那样:stackoverflow.com/a/184780/11156237“以后对其中任何一个内容的修改会立即反映在另一个内容中,因为它们共享内容。”
-
在复制操作之后,您以两个包含指向相同姓氏值的指针的值结束。当您取消对姓氏的引用以更改/读取其值时,您将访问两个结构实例共享的指针所寻址的内存。这里没有什么需要澄清的。这就是它的设计方式。
标签: go deep-copy shallow-copy