Go 的 errors.Unwrap 使用方法

24 min read

errors.Unwrap 是 Go 1.13 中新增的函数,用于得到一个错误的底层错误(Underlying Error)。在 Go 中,错误通常是由多个层级的函数返回并组成的,每个函数都可能引发错误。这时我们需要使用 errors.Unwrap 来递归地找到这个错误的底层错误。

errors.Unwrap 接受一个 error 类型的参数,并返回其底层错误,如果没有底层错误,则返回 nil。底层错误的类型必须实现了 Unwrap() 方法,以便 errors.Unwrap 能够正确地将其解包。

下面是一个示例程序,演示了如何使用 errors.Unwrap 得到一个错误的底层错误:

package main

import (
    "errors"
    "fmt"
)

type MyError struct {
    Msg string
    Err error
}

func (e *MyError) Error() string {
    return e.Msg
}

func (e *MyError) Unwrap() error {
    return e.Err
}

func main() {
    err := &MyError{
        Msg: "MyError",
        Err: errors.New("base error"),
    }
    
    fmt.Println("err:", err)
    fmt.Println("unwrap(err):", errors.Unwrap(err))
}

输出如下:

err: MyError
unwrap(err): base error

在上面的示例中,我们定义了一个自定义错误类型 MyError,它包含了一个底层错误 Err。我们实现了 Unwrap() 方法来满足 errors.Unwrap 的要求。在 main() 函数中,我们创建了一个 MyError 类型的错误,然后使用 errors.Unwrap 得到了它的底层错误,并将其打印到控制台上。

需要注意的是,errors.Unwrap 只会返回一个底层错误,而不会返回所有的错误。在处理错误时,我们应该根据具体情况,逐层调用 errors.Unwrap 来得到所有的底层错误。