我正在學習 Go 中的錯誤比較是如何作業的,并發現了一些我無法理解的東西。
函式errors.Is(err, target error)檢查目標是否可比較。
func Is(err, target error) bool {
if target == nil {
return err == target
}
isComparable := reflectlite.TypeOf(target).Comparable()
for {
if isComparable && err == target {
return true
}
來源
鑒于 Go 中的所有介面都是可比較的并且error是一個介面,這個呼叫處理哪種情況?
uj5u.com熱心網友回復:
介面值是可比較的,但比較可能會在運行時出現混亂。規范說:
如果該型別的值不可比較,則比較具有相同動態型別的兩個介面值會導致運行時恐慌。
當目標的具體型別不可比較時,該檢查通過跳過比較來防止恐慌。
這是一個例子:
type E []byte
func (e E) Error() string { return string(e) }
func (e E) Is(target error) bool {
t, ok := target.(E)
return ok && bytes.Equal(e, t)
}
var a error = E{}
var b error = E{}
fmt.Println(errors.Is(a, b)) // prints true
fmt.Println(a == b) // panics because slices are not comparable
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/414530.html
標籤:
