比较Go中的结构
我有一个测试,它将两个指针的相等性与结构的实例(比较Go中的结构,go,struct,equality,platform,Go,Struct,Equality,Platform,我有一个测试,它将两个指针的相等性与结构的实例(MyStruct)进行比较。指针存储在其他结构中(container1和container2)。下面是我检查等式的方法: require.Equal(*container1.MyStruct,*container2.MyStruct) Equals()方法来自验证库: 当我在我的Mac上运行它时,这个测试通过了。但是,当我将更改推送到构建服务器(Linux)时,测试失败。错误消息是标准的error:notequal…消息,但是当我区分输出中显示的预
MyStruct
)进行比较。指针存储在其他结构中(container1
和container2
)。下面是我检查等式的方法:
require.Equal(*container1.MyStruct,*container2.MyStruct)
Equals()
方法来自验证库:
当我在我的Mac上运行它时,这个测试通过了。但是,当我将更改推送到构建服务器(Linux)时,测试失败。错误消息是标准的error:notequal…
消息,但是当我区分输出中显示的预期和实际值时,它们是完全相同的
我认为Go可能是在比较指针的地址,而不是内容,但require上的注释使这看起来不太可能:
//指针变量的相等性是根据引用值的相等性(与内存地址相反)来确定的。
知道这是怎么回事吗?Go在Mac和Linux上的表现是否有所不同
我无法在此发布详细信息,因为这是我在工作中接触的代码库中看到的一个问题。问题是当结构包含
时间对象时,Equal
函数的“expected…actual…”打印结构逻辑的输出中存在错误。下面是错误输出的一个片段:(我删除了结构的不相关字段):
字段看起来是一样的。但是,如果我直接比较MyStruct.BuildStartDateUtc
,我会得到以下结果:
expected: &time.Time{wall:0x389ccfe6, ext:63733398658, loc:(*time.Location)(0x101d4e0)}
actual : &time.Time{wall:0x389ccfe6, ext:63733398658, loc:(*time.Location)(nil)}
“loc”字段在实际数据中缺失。这就是导致比较失败的原因,但由于当我们比较包含时间的结构时,“loc”显然不包括在输出中,因此我们得到了一个非常令人困惑的“expected…actual…”输出,其中实际/预期在不包含时看起来完全相等
当我同步正在比较的时间的位置时,测试通过
看起来可能与此问题有关:您是否100%确定在两种环境中运行的Go版本完全相同?您是否尝试过使用reflect.DeepEqual或assert.Equal?这也可能是一个依赖性问题(您的IDE可能引用的stretchr/require的本地版本与在生成服务器中获得的版本不同)请编辑您的问题,将相关源代码包括在内,以再现问题。@A.Loreficerequire.Equal
和assert.Equal
在实现中使用了reflect.DeepEqual
。唯一的问题是当您试图比较包含映射的struct时,因为它们没有保持顺序。但它应该在其他方面起作用。
expected: &time.Time{wall:0x389ccfe6, ext:63733398658, loc:(*time.Location)(0x101d4e0)}
actual : &time.Time{wall:0x389ccfe6, ext:63733398658, loc:(*time.Location)(nil)}