亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

比較 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 關注
  • 123 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號