我想复制一个对象,这样我就有两个相同的对象,具有两个不同的内存地址.我的第一次try 失败了:
aa := a
assert.NotEqual(t, &a, &aa, "Copied items should not be the same object.") // Test fails
我能修复它,使它真正复制 struct 吗?这种 struct 没有什么特别之处.
我想复制一个对象,这样我就有两个相同的对象,具有两个不同的内存地址.我的第一次try 失败了:
aa := a
assert.NotEqual(t, &a, &aa, "Copied items should not be the same object.") // Test fails
我能修复它,使它真正复制 struct 吗?这种 struct 没有什么特别之处.
在GO中,基元类型和只包含基元类型的 struct 是按值复制的,因此您只需将其赋给一个新变量(或从函数返回)即可复制它们.例如:
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
注意,正如 comments 者所提到的,您示例中的念力很可能是由于您正在使用的测试库的语义造成的.
如果 struct 碰巧包含数组、切片或指针,则需要对引用的对象执行深度复制,除非希望在副本之间保留引用.Golang不提供内置的深度复制功能,因此您必须实现自己的功能,或者使用许多免费提供的库中的一个.