Equal
比较方法
错误对象支持比较, Equal
方法用于完整判断两个 error
是否相同。主要通过以下方法:
// Equal reports whether current error `err` equals to error `target`.
// Please note that, in default comparison for `Error`,
// the errors are considered the same if both the `code` and `text` of them are the same.
func Equal(err, target error) bool
接口定义
如果自定义的错误数据结构需要支持比较,需要自定义的错误结构实现以下接口:
// IEqual is the interface for Equal feature.
type IEqual interface {
Error() string
Equal(target error) bool
}
通过 GoFrame
框架错误组件创建的错误对象已经实现实现了该接口,组件默认比较逻辑判断错误码和错误信息。
信息
需要注意,如果两个错误均不带错误码,并且错误信息相等,那么组件认为两个错误相等。
使用示例
func ExampleEqual() {
err1 := errors.New("permission denied")
err2 := gerror.New("permission denied")
err3 := gerror.NewCode(gcode.CodeNotAuthorized, "permission denied")
fmt.Println(gerror.Equal(err1, err2))
fmt.Println(gerror.Equal(err2, err3))
// Output:
// true
// false
}
Is
包含判断
错误对象支持包含判断, Is
方法用于判断给定的 error
是否在指定的 error
错误链路中(如果 error
带有堆栈,会递归判断)。主要通过以下方法:
// Is reports whether current error `err` has error `target` in its chaining errors.
// It is just for implements for stdlib errors.Unwrap from Go version 1.17.
func Is(err, target error) bool
使用示例
func ExampleIs() {
err1 := errors.New("permission denied")
err2 := gerror.Wrap(err1, "operation failed")
fmt.Println(gerror.Is(err1, err1))
fmt.Println(gerror.Is(err2, err2))
fmt.Println(gerror.Is(err2, err1))
fmt.Println(gerror.Is(err1, err2))
// Output:
// false
// true
// true
// false
}