我如何在 Golang 中复制结构?

新手上路,请多包涵

我想复制一个对象,以便我有两个具有两个不同内存地址的相同对象。我的第一次尝试失败了:

 aa := a
assert.NotEqual(t, &a, &aa, "Copied items should not be the same object.") // Test fails

我可以解决这个问题,让它真正复制结构吗?这种结构没有什么特别之处。

原文由 Salim Fadhley 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 535
2 个回答

在 go 中,原始类型和仅包含原始类型的结构是按值复制的,因此您可以通过简单地分配给新变量(或从函数返回)来复制它们。例如:

 type Person struct{
  Name string
  Age  int
}

alice1 := Person{"Alice", 30}
alice2 := alice1
fmt.Println(alice1 == alice2)   // => true, they have the same field values
fmt.Println(&alice1 == &alice2) // => false, they have different addresses

alice2.Age += 10
fmt.Println(alice1 == alice2)   // => false, now they have different field values

请注意,正如评论者所提到的,您的示例中的混淆可能是由于您正在使用的测试库的语义造成的。

如果您的结构恰好包含数组、切片或指针,那么您将需要执行引用对象的深层复制,除非您希望保留副本之间的引用。 Golang 不提供内置的深层复制功能,因此您必须实现自己的功能或使用提供它的众多免费可用库之一。

原文由 maerics 发布,翻译遵循 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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏