Equal比较方法

错误对象支持比较,Equal方法用于完整判断两个error是否相同。主要通过以下方法:

  1. // Equal reports whether current error `err` equals to error `target`.
  2. // Please note that, in default comparison for `Error`,
  3. // the errors are considered the same if both the `code` and `text` of them are the same.
  4. func Equal(err, target error) bool

接口定义

如果自定义的错误数据结构需要支持比较,需要自定义的错误结构实现以下接口:

  1. Equal(target error) bool

通过GoFrame框架错误组件创建的错误对象已经实现实现了该接口,组件默认比较逻辑判断错误码和错误信息。

需要注意,如果两个错误均不带错误码,并且错误信息相等,那么组件认为两个错误相等。

使用示例

  1. func ExampleEqual() {
  2. err1 := errors.New("permission denied")
  3. err2 := gerror.New("permission denied")
  4. err3 := gerror.NewCode(gcode.CodeNotAuthorized, "permission denied")
  5. fmt.Println(gerror.Equal(err1, err2))
  6. fmt.Println(gerror.Equal(err2, err3))
  7. // Output:
  8. // true
  9. // false
  10. }

Is包含判断

错误对象支持包含判断,Is方法用于判断给定的error是否在指定的error错误链路中(如果error带有堆栈,会递归判断)。主要通过以下方法:

  1. // Is reports whether current error `err` has error `target` in its chaining errors.
  2. // It is just for implements for stdlib errors.Unwrap from Go version 1.17.
  3. func Is(err, target error) bool

接口定义

如果自定义的错误数据结构需要支持包含判断,需要自定义的错误结构实现以下接口:

  1. Is(target error) bool

通过GoFrame框架错误组件创建的错误对象已经实现实现了该接口。

需要注意,通过errors标准库创建的错误对象是最原始的错误对象,仅带有错误字符串,没有实现Is接口,因此不支持Is判断。

使用示例

  1. func ExampleIs() {
  2. err1 := errors.New("permission denied")
  3. err2 := gerror.Wrap(err1, "operation failed")
  4. fmt.Println(gerror.Is(err1, err1))
  5. fmt.Println(gerror.Is(err2, err2))
  6. fmt.Println(gerror.Is(err2, err1))
  7. fmt.Println(gerror.Is(err1, err2))
  8. // Output:
  9. // false
  10. // true
  11. // true
  12. // false
  13. }