我有一個比較兩個指向結構(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 關注
- 123 瀏覽
添加回答
舉報
0/150
提交
取消