我正在學(xué)習(xí) Go 中的錯(cuò)誤比較是如何工作的,并發(fā)現(xiàn)了一些我無法理解的東西。函數(shù)errors.Is(err, target error)檢查目標(biāo)是否可比較。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是一個(gè)接口,這個(gè)調(diào)用處理哪種情況?
1 回答

慕萊塢森
TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊
接口值是可比較的,但比較可能會(huì)在運(yùn)行時(shí)出現(xiàn)混亂。規(guī)范說:
如果該類型的值不可比較,則比較具有相同動(dòng)態(tài)類型的兩個(gè)接口值會(huì)導(dǎo)致運(yùn)行時(shí)恐慌。
當(dāng)目標(biāo)的具體類型不可比較時(shí),該檢查通過跳過比較來防止恐慌。
這是一個(gè)例子:
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
- 1 回答
- 0 關(guān)注
- 145 瀏覽
添加回答
舉報(bào)
0/150
提交
取消