我有一个比较两个指向结构(MyStruct)实例的指针是否相等的测试。指针存储在其他结构(container1和container2)中。这是我检查相等性的方法:require.Equal(*container1.MyStruct, *container2.MyStruct)该Equals()方法来自Testify库:https ://github.com/stretchr/testify/blob/master/require/require_forward.go#L128当我在我的 Mac 上运行它时,这个测试通过了。但是,当我将更改推送到我们的构建服务器 (Linux) 时,测试失败。错误消息是标准Error: Not equal...消息,但是当我区分输出中显示的预期和实际时,它们完全相同!我想也许 Go 是以某种方式比较指针的地址而不是内容,但是 require.Equal 上的评论使这看起来不太可能:// Pointer variable equality is determined based on the equality of the referenced values (as opposed to the memory addresses) 知道这里发生了什么吗?Go 在 Mac 和 Linux 上的行为是否不同?我无法在此处发布详细信息,因为这是我在工作中接触的代码库中看到的一个问题。
1 回答

慕神8447489
TA贡献1780条经验 获得超1个赞
问题是Equal
当结构包含Time
对象时,函数的“预期...实际...”打印逻辑的输出中存在错误。这是错误输出的一个片段:(我已经删除了结构的不相关字段):
Error Trace: my_test.go:388 my_test.go:50 Error: Not equal: expected: { BuildStartDateUtc: 2020-08-17 22:43:05.330062876 +0000 UTC, actual : { BuildStartDateUtc: 2020-08-17 22:43:05.330062876 +0000 UTC, }
字段看起来相同。但是,如果我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”字段。这就是导致比较失败的原因,但是由于当我们比较包含 a 的结构时,输出中显然不包含“loc” Time
,所以我们得到一个非常令人困惑的“预期...实际...”输出,而实际/当他们不是时,预期看起来完全相等。
当我同步被比较Location
的Time
s 时,测试通过了。
看起来它可能与这个 Testify 问题有关:https ://github.com/stretchr/testify/issues/984
- 1 回答
- 0 关注
- 124 浏览
添加回答
举报
0/150
提交
取消