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不提供内置的深层复制功能,因此您必须实现自己的深层复制功能或使用提供它的许多免费可用库之一。
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)
}
- 3 回答
- 0 关注
- 384 浏览
添加回答
举报