为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Golang中复制结构?

如何在Golang中复制结构?

Go
慕妹3146593 2021-04-10 14:15:14
我想复制一个对象,以使我拥有两个具有两个不同内存地址的相同对象。我对此的第一次尝试失败了:aa := a assert.NotEqual(t, &a, &aa, "Copied items should not be the same object.") // Test fails我可以解决这个问题,使其真正复制该结构吗?这个结构没有什么特别的。
查看完整描述

3 回答

?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

在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不提供内置的深层复制功能,因此您必须实现自己的深层复制功能或使用提供它的许多免费可用库之一。


查看完整回答
反对 回复 2021-04-19
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

您可以使用带有按值传递的函数,并根据需要返回未更改或更改的参数。


使用上面的结构:


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)

}


查看完整回答
反对 回复 2021-04-19
  • 3 回答
  • 0 关注
  • 384 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信