在 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