目录

写过 C 的同学知道,C 语言中常常返回整数错误码(errno)来表示函数处理出错,通常用 -1 来表示错误,用 0 表示正确。

而在 Go 中,我们使用 error 类型来表示错误,不过它不再是一个整数类型,是一个接口类型:

type error interface {     Error() string }

它表示那些能用一个字符串就能说清的错误。

我们最常用的就是 errors.New() 函数,非常简单:

// src/errors/errors.go  func New(text string) error {     return &errorString{text} }  type errorString struct {     s string }  func (e *errorString) Error() string {     return e.s }

使用 New 函数创建出来的 error 类型实际上是 errors 包里未导出的 errorString 类型,它包含唯一的一个字段 s,并且实现了唯一的方法:Error() string

通常这就够了,它能反映当时“出错了”,但是有些时候我们需要更加具体的信息,例如:

func Sqrt(f float64) (float64, error) {     if f < 0 {         return 0, errors.New("math: square root of negative number")     }     // implementation }

当调用者发现出错的时候,只知道传入了一个负数进来,并不清楚到底传的是什么值。在 Go 里:

It is the error implementation's responsibility to summarize the context.

它要求返回这个错误的函数要给出具体的“上下文”信息,也就是说,在 Sqrt 函数里,要给出这个负数到底是什么。

所以,如果发现