包装
通过 fmt.Errorf + %w 进行 error的进一层封装
package main
import "fmt"
type MyError struct{}
func (MyError) Error() string {
//TODO implement me
panic("implement me")
}
func main() {
err := MyError{}
//pack a new Error %!v(PANIC=Error method: implement me)
fmt.Println(fmt.Errorf("pack a new Error %w", err))
}
判断error是否相同
通过 errors.Is(err, target error) bool来判断两个error是否相同,如果是对包装过的error进行验证,会自动进行解包去匹配
package main
import (
"errors"
"fmt"
)
type MyError struct {
Name string
}
func (MyError) Error() string {
//TODO implement me
panic("implement me")
}
func main() {
err := MyError{
Name: "aa",
}
//pack a new Error %!v(PANIC=Error method: implement me)
newError := fmt.Errorf("pack a new Error %w", err)
fmt.Println(errors.Is(newError, err)) //true (newError 自动解包)
fmt.Println(errors.Is(MyError{Name: "aa"}, err)) //true
fmt.Println(errors.Is(MyError{Name: "bb"}, err)) //false
fmt.Println(errors.Is(&MyError{Name: "aa"}, err)) //false
}
解包
通过 errors.Unwrap(err error) 进行解包,调用一次解一次
package main
import (
"errors"
"fmt"
)
type MyError struct {
Name string
}
func (MyError) Error() string {
return "my error"
}
func main() {
err := MyError{
Name: "aa",
}
newError := fmt.Errorf("new error %w", err)
topError := fmt.Errorf("top error %w", newError)
fmt.Println(topError) // top error new error my error
newError = errors.Unwrap(topError) //解包
fmt.Println(newError) // new error my error
oldError := errors.Unwrap(newError)
fmt.Println(oldError) // my error
fmt.Println(errors.Is(oldError, err)) //true
}
判断error类型是否相同
errors.As(err error, target any) bool 来判断两个error的类型 是否相同,target 需是指针类型
package main
import (
"errors"
"fmt"
)
type MyError struct {
Name string
}
func (MyError) Error() string {
return "my error"
}
func main() {
err := MyError{
Name: "aa",
}
//通过 errors.Unwrap(err error) 进行解包,调用一次解一次
newError := fmt.Errorf("new error %w", err)
topError := fmt.Errorf("top error %w", newError)
fmt.Println(errors.As(topError, &MyError{})) //true
}