我想复制一个对象,以便我有两个具有两个不同内存地址的相同对象。我的第一次尝试失败了:
aa := a
assert.NotEqual(t, &a, &aa, "Copied items should not be the same object.") // Test fails
我可以解决这个问题,让它真正复制结构吗?这种结构没有什么特别之处。
原文由 Salim Fadhley 发布,翻译遵循 CC BY-SA 4.0 许可协议
我想复制一个对象,以便我有两个具有两个不同内存地址的相同对象。我的第一次尝试失败了:
aa := a
assert.NotEqual(t, &a, &aa, "Copied items should not be the same object.") // Test fails
我可以解决这个问题,让它真正复制结构吗?这种结构没有什么特别之处。
原文由 Salim Fadhley 发布,翻译遵循 CC BY-SA 4.0 许可协议
DeepCopy 是一项非常繁重的操作,因此应尽可能避免。对于像下面这样的复杂结构,我们可以优化代码。
type Address struct {
city string
state string
}
type Person struct {
age int
name string
address []Address
}
p := Person{
age: 20,
name: "Jack",
address: []Address{
{
city: "city1",
state: "state1",
}, {
city: "city2",
state: "state2",
},
},
}
var q Person
q.age = p.age
q.name = p.name
q.address = append(q.address, p.address...)
q.address[0].city = "cityx"
结果:
p object:
{20 Jack [{city1 state1} {city2 state2}]}
q object:
{20 Jack [{cityx state1} {city2 state2}]}
推理:
从上面的例子可以看出,改变q时p对象并没有改变。这种方法可用于嵌套结构数组。
原文由 Sezal Agrawal 发布,翻译遵循 CC BY-SA 4.0 许可协议
7 回答5.4k 阅读
6 回答7k 阅读✓ 已解决
4 回答2.4k 阅读
1 回答3.4k 阅读
2 回答945 阅读✓ 已解决
2 回答2.3k 阅读
1 回答2.2k 阅读
在 go 中,原始类型和仅包含原始类型的结构是按值复制的,因此您可以通过简单地分配给新变量(或从函数返回)来复制它们。例如:
请注意,正如评论者所提到的,您的示例中的混淆可能是由于您正在使用的测试库的语义造成的。
如果您的结构恰好包含数组、切片或指针,那么您将需要执行引用对象的深层复制,除非您希望保留副本之间的引用。 Golang 不提供内置的深层复制功能,因此您必须实现自己的功能或使用提供它的众多免费可用库之一。