我想复制一个对象,这样我就有两个相同的对象,具有两个不同的内存地址.我的第一次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不提供内置的深度复制功能,因此您必须实现自己的功能,或者使用许多免费提供的库中的一个.

Go相关问答推荐

如何使用Docker Compose配置Go,使main. go文件位于/CMD文件夹中

是不是有什么原因导致`Strings.EqualFold`不先进行长度比较?

为什么没有正确生成这些元组?

使用!NOT运算符的Golang文本/模板多个条件

如何修复proxyconnect tcp:tls:第一条记录看起来不像tls握手

Go Template 动态获取变量

我应该先解锁然后再广播吗?

Golang校验器包:重命名字段错误处理

Global Thread-local Storage 在 Go 中的可行性和最佳实践

如何用mpb创建两行进度条?

上传图片失败,出现错误dial tcp: lookup api.cloudinary.com: no such host

Wire google Inject with multi return from provider 函数

Golang模板无法访问embedFS中的文件

github.com/rs/zerolog 字段的延迟判断

如何在测试中使用自定义标志(使用`testify/suite`)

Gorm 在保存/创建时序列化 struct

Go lang - 惯用的默认后备

测试包外文件时的 Golang 测试覆盖率

正则表达式处理数字签名的多个条目

如何解决在mac m1中运行gcc失败退出状态1?