Golang 的 Error 是如何实现的?

Go语言实现错误(Error)的方式为:
一、错误接口
Go语言内建了error 接口定义:

type error interface {
    Error() string
}  

只要实现Error()方法,就实现了error接口。

二、内置错误
Go语言提供了几个内置的错误类型:

  • errors.New – 创建一个具体的错误
  • fmt.Errorf – 根据格式创建一个错误

例如:

errors.New("this is an error")
fmt.Errorf("file not found: %s", filename)

三、自定义错误
也可以定义一个自定义错误类型:

type MyError struct {
   Msg string
}

func (e *MyError) Error() string {
    return fmt.Sprintf("my error: %s", e.Msg)
}

然后直接返回:

return &MyError{"something wrong"} 

四、错误处理
可以使用if err != nil 来处理错误。

if err != nil {
    fmt.Println(err)
}

或者通过switch 区分不同错误类型。

switch err.(type) {
 case *MyError:
   // ...
}

总的来说,Go语言实现错误的方式为:

  1. 定义 Error 接口
  2. 提供内置错误类型
  3. 自定义错误类型 – 实现 Error() 方法
  4. 通过 if err != nil 或者 switch 区分错误类型

这种做法的优点在于错误具备良好的扩展性。