我正在检查 Go v1.13 Go v1.14 中的错误跟踪。为什么似乎只能找到没有参数或带有值接收器的错误实现errors.Is()?这意味着能够包装的错误实现必须有一个值接收器才能被errors.Is().
package main
import (
"fmt"
"errors"
)
type someAtomicError struct {}
func (e *someAtomicError) Error() string { return "Hi!" }
func checkAtomicError() {
e := &someAtomicError{}
e2 := fmt.Errorf("whoa!: %w", e)
e2IsE := errors.Is(e2, &someAtomicError{})
fmt.Println("atomic error trace ---\t\t", e2, "\t\t--- is traceable: ", e2IsE)
}
type someWrapperError struct {
Msg string
Err error
}
func (e someWrapperError) Error() string { return fmt.Sprintf("%s: %v", e.Msg, e.Err) }
func (e someWrapperError) Unwrap() error { return e.Err }
func checkWrapperError() {
e := someWrapperError{"Hi!", nil}
e2 := fmt.Errorf("whoa!: %w", e)
e2IsE := errors.Is(e2, someWrapperError{"Hi!", nil})
fmt.Println("wrapper error trace ---\t\t", e2, "\t--- is traceable: ", e2IsE)
}
type somePointerWrapperError struct {
Msg string
Err error
}
func (e *somePointerWrapperError) Error() string { return fmt.Sprintf("%s: %v", e.Msg, e.Err) }
func (e *somePointerWrapperError) Unwrap() error { return e.Err }
func checkPointerWrapperError() {
e := &somePointerWrapperError{"Hi!", nil}
e2 := fmt.Errorf("whoa!: %w", e)
e2IsE := errors.Is(e2, &somePointerWrapperError{"Hi!", nil})
fmt.Println("pointer wrapper error trace ---\t", e2, "\t--- is traceable: ", e2IsE)
}
func main() {
checkAtomicError()
checkWrapperError()
checkPointerWrapperError()
}
//atomic error trace --- whoa!: Hi! --- is traceable: true
//wrapper error trace --- whoa!: Hi!: <nil> --- is traceable: true
//pointer wrapper error trace --- whoa!: Hi!: <nil> --- is traceable: false
https://play.golang.org/p/-hSukZ-gii2
似乎参数的任何差异,包括包装的错误参数,Err都会导致无法找到类型errors.Is()。
呼如林
qq_笑_17
泛舟湖上清波郎朗
随时随地看视频慕课网APP
相关分类