在 Go 语言中,error是一个内置的接口类型,用于表示错误情况。error接口的定义如下:

type error interface {    Error() string}

任何具有Error() string方法的类型都可以被视为实现了error接口。

创建自定义错误

尽管 Go 提供了errors.New函数用于创建简单的错误信息,但有时候,我们可能需要创建更复杂的自定义错误。这可以通过定义一个实现了Error方法的结构体来实现:

type MyError struct {    Msg string    File string    Line int}func (e *MyError) Error() string {    return fmt.Sprintf("%s:%d: %s", e.File, e.Line, e.Msg)}

在这个例子中,MyError包含了一个错误消息、文件名和行号。Error方法返回一个格式化的错误字符串。

创建MyError的实例:

err := &MyError{    Msg: "something went wrong",    File: "main.go",    Line: 42,}fmt.Println(err)  // 输出 "main.go:42: something went wrong"

错误的包装和解包

在处理错误时,我们有时候会遇到需要将一个错误包装到另一个错误中的情况,这可以通过fmt.Errorf函数和%w动词实现:

func Foo() error {    return errors.New("foo failed")}func Bar() error {    err := Foo()    if err != nil {        return fmt.Errorf("bar failed: %w", err)    }    return nil}err := Bar()if err != nil {    fmt.Println(err)  // 输出 "bar failed: foo failed"}

在这个例子中,Bar函数调用了Foo函数,如果Foo函数返回了一个错误,Bar函数会将这个错误包装到它自己的错误中。

你可以使用errors.As函数检查错误是否为特定的类型,或者使用errors.Unwrap函数获取被包装的错误。

理解并正确使用error接口是编写 Go 程序的关键,因为大多数函数和方法都会返回一个error类型的值来表示可能的错误情况。
推荐阅读:

https://mp.weixin.qq.com/s/dV2JzXfgjDdCmWRmE0glDA

https://mp.weixin.qq.com/s/an83QZOWXHqll3SGPYTL5g