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

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

錯誤。Is(...) 不是對稱的?

錯誤。Is(...) 不是對稱的?

Go
ITMISS 2022-07-11 10:20:57
我試圖找到正確的比較方法errors,發現了一些奇怪的行為type errorOne struct{}func (e errorOne) Error() string {    return "Error One"}e1 := errorOne{}e2 := fmt.Errorf("E2: %w", errorOne{}) // return 'error' interfaceres1 := e1 == e2          // falseres2 := errors.Is(e1, e2) // falseres3 := errors.Is(e2, e1) // true看起來errors.Is(...)不是對稱的(或者我不理解方法行為)。怎么了?
查看完整描述

2 回答

?
慕俠2389804

TA貢獻1719條經驗 獲得超6個贊

文檔中:

報告 err 鏈中的任何錯誤是否與目標匹配。該鏈由 err 本身和通過重復調用 Unwrap 獲得的錯誤序列組成。

因此,雖然您可以 unwrape2以檢索e1,但如果您 unwrap e1,e2則不在鏈中。


查看完整回答
反對 回復 2022-07-11
?
萬千封印

TA貢獻1891條經驗 獲得超3個贊

errors.Is()不是“等于”實現,而是“是否包裝”檢查。


e2換行e1,但e1不換行e2。那么為什么會errors.Is()是對稱的呢?“環繞”是一種單向關系;例如,有母女關系,但母親的母親不是她的女兒。


一個包裝的錯誤可能被另一個包裝,創建一個“鏈”。errors.Is()基本上告訴您給定的錯誤是否是該“鏈”的一部分。


請注意,您可以使用“提取”包裝的錯誤errors.Unwrap(),例如:


fmt.Println(e2)

fmt.Println(errors.Unwrap(e2))

fmt.Println(errors.Unwrap(errors.Unwrap(e2)))

這將輸出(在Go Playground上嘗試):


E2: Error One

Error One

<nil>

第三行是<nil>因為errors.Unwrap(e2)返回e1(更具體地說是 的副本e1),并且它不包含任何錯誤。


查看完整回答
反對 回復 2022-07-11
  • 2 回答
  • 0 關注
  • 160 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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