猿问

如何在Golang中复制结构?

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

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

我可以解决这个问题,使其真正复制该结构吗?这个结构没有什么特别的。


慕妹3146593
浏览 385回答 3
3回答

哆啦的时光机

在Go语言中,原始类型和仅包含原始类型的结构按值复制,因此您可以通过简单地分配给新变量(或从函数返回)来复制它们。例如:type Person struct{  Name string  Age  int}alice1 := Person{"Alice", 30}alice2 := alice1fmt.Println(alice1 == alice2)   // => true, they have the same field valuesfmt.Println(&alice1 == &alice2) // => false, they have different addressesalice2.Age += 10fmt.Println(alice1 == alice2)   // => false, now they have different field values请注意,正如评论者所提到的,示例中的混乱很可能是由于所使用的测试库的语义所致。如果您的结构恰好包含数组,切片或指针,那么除非您希望在副本之间保留引用,否则您将需要对所引用对象执行深层副本。Golang不提供内置的深层复制功能,因此您必须实现自己的深层复制功能或使用提供它的许多免费可用库之一。

繁星点点滴滴

您可以使用带有按值传递的函数,并根据需要返回未更改或更改的参数。使用上面的结构:func main() {    copyOf := func(y Person) Person {        y.name = "Polonius"        y.address = append(y.address, Address{            city:  "other city",            state: "other state",        })        return y    }    p := Person{        age:  20,        name: "Jack",        address: []Address{            {                city:  "city1",                state: "state1",            }, {                city:  "city2",                state: "state2",            },        },    }    q := copyOf(p)    fmt.Printf("Orig %v, \naddrss: %p \n\n", p, &p)    fmt.Printf("Copy %v, \naddress: %p\n\n", q, &q)}
随时随地看视频慕课网APP

相关分类

Go
我要回答