为了账号安全,请及时绑定邮箱和手机立即绑定

比较 Go 中的结构

比较 Go 中的结构

Go
慕容708150 2022-06-27 09:27:15
我有一个比较两个指向结构(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,所以我们得到一个非常令人困惑的“预期...实际...”输出,而实际/当他们不是时,预期看起来完全相等。

当我同步被比较LocationTimes 时,测试通过了。

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


查看完整回答
反对 回复 2022-06-27
  • 1 回答
  • 0 关注
  • 124 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号