------------------------------------------------------------ Go 语言使用 error 类型来返回函数执行过程当中遇到的错误,若是返回的 error 值为 nil,则表示未遇到错误,不然 error 会返回一个字符串,用于说明遇到了什么错误。 其实 error 只是一个接口,定义以下: ------------------------------ type error interface { Error() string } ------------------------------ 你能够用任何类型去实现它(只要添加一个 Error() 方法便可),也就是说,error 能够是任何类型,这意味着,函数返回的 error 值实际能够包含任意信息,不必定是字符串(固然字符串是必须的)。 error 不必定表示一个错误,它能够表示任何信息,好比 io 包中就用 error 类型的 io.EOF 表示数据读取结束,而不是遇到了什么错误。再好比 path/filepath 包中用 error 类型的 filepath.SkipDir 表示跳过当前目录,继续遍历下一个目录,而不是遇到了什么错误。 errors 包实现了一个最简单的 error 类型,只包含一个字符串,它能够记录大多数状况下遇到的错误信息。errors 包的用法也很简单,只有一个 New 函数,用于生成一个最简单的 error 对象: ------------------------------ // 将字符串 text 包装成一个 error 对象返回 func New(text string) error ------------------------------ // 示例 func SomeFunc() error { if 遇到错误 { return errors.New("遇到了某某错误") } return nil } ------------------------------ 若是你的程序须要记录更多的错误信息,好比时间、数值等信息,能够声明一个自定义的 error 类型。 ------------------------------ // 示例 package main import ( "fmt" "time" ) type myError struct { err string time time.Time count int } func (m *myError) Error() string { return fmt.Sprintf("%s %d 次。时间:%v", m.err, m.count, m.time) } func newErr(s string, i int) *myError { return &myError{ err: s, time: time.Now(), count: i, } } var count int func SomeFunc() error { if true { count++ return newErr("遇到某某状况", count) } return nil } func main() { for i := 0; i < 5; i++ { if err := SomeFunc(); err != nil { fmt.Println(err) } } } ------------------------------------------------------------