【问题标题】:Comparing structs in Go比较 Go 中的结构
【发布时间】:2020-08-18 19:34:26
【问题描述】:

我有一个比较两个指向结构实例的指针是否相等的测试 (MyStruct)。指针存储在其他结构中(container1container2)。以下是我检查相等性的方法:

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.Equalassert.Equal 在他们的实现中使用 reflect.DeepEqual。唯一的问题是当您尝试比较包含映射的结构时,因为它们不保持顺序。但它应该可以正常工作。

标签: go struct equality platform


【解决方案1】:

问题是当结构包含Time 对象时,Equal 函数的“预期...实际...”打印逻辑的输出中存在错误。这是错误输出中的一个 sn-p:(我已经删除了结构的不相关字段):

        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”字段。这就是导致比较失败的原因,但是由于当我们比较包含Time 的结构时,输出中显然不包含“loc”,所以我们会得到一个非常令人困惑的“预期......实际......”输出,其中实际的/预期的看起来完全一样,当它们不一样时。

当我同步正在比较的Times 中的Location 时,测试通过了。

看起来它可能与这个 Testify 问题有关:https://github.com/stretchr/testify/issues/984

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多