【发布时间】:2020-08-18 19:34:26
【问题描述】:
我有一个比较两个指向结构实例的指针是否相等的测试 (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 上的行为是否不同?
我无法在此处发布详细信息,因为这是我在工作中接触的代码库中看到的问题。
【问题讨论】:
-
您是否 100% 确定您在两种环境中运行的 Go 版本完全相同?您是否尝试过使用 reflect.DeepEqual 或 assert.Equal?这也可能是一个依赖问题(您的 IDE 可能引用了本地版本的stretchr/需要与构建服务器中获得的不同)
-
请编辑您的问题以包含相关源代码以重现该问题。
-
我记得 @A.Lorefice
require.Equal和assert.Equal在他们的实现中使用reflect.DeepEqual。唯一的问题是当您尝试比较包含映射的结构时,因为它们不保持顺序。但它应该可以正常工作。
标签: go struct equality platform