我試圖找到正確的比較方法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 回答

萬千封印
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),并且它不包含任何錯誤。
- 2 回答
- 0 關注
- 160 瀏覽
添加回答
舉報
0/150
提交
取消