error 接口
Go语言引入了一个关于错误处理的标准模式,即error接口,该接口定义:
1 2 3 4 5 |
# builtin/builtin.go type error interface { Error() string } |
对于大多数函数,如果要返回错误,大致可以定义为如下模式,将error作为多种返回值中的最后一个,但这并非是强制要求:
1 2 3 4 |
func Foo(param int)(n int, err error) { // ... } |
通过errors
下的New
方法可以创建一个错误:
1 2 3 4 5 6 |
import "errors" func Foo(param int)(n int, err error) { return 0, errors.New("this is a error") } |
error 源码分析
errors/errors.go
下定义了errorString
,并且让其实现了Error
方法。
1 2 3 4 5 6 7 8 9 |
type errorString struct { s string } func (e *errorString) Error() string { return e.s } |
所以New
方法创建的errorString
是一个error
类型。
1 2 3 4 5 6 |
#errors/errors.go func New(text string) error { return &errorString{text} } |
实现自己的错误类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
type MyError struct { When time.Time What string } func (e MyError) Error() string { return fmt.Sprintf("%v: %v", e.When, e.What) } func hello() error { return MyError{ time.Date(2018, 3, 15, 22, 30, 0, 0, time.UTC), "this is my error", } |