Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较Go中的结构_Go_Struct_Equality_Platform - Fatal编程技术网

比较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.Lorefice
require.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)}