Skip to content

常用语法

错误处理

  • Go 语言无内置 exceptio 机制,只提供 error 接口供定义错误
type error interface {
    Error() string
} 
  • 可通过 errors.New 或 fmt.Errorf 创建新的 error
    • var errNotFound error = errors.New("NotFound")
  • 通常应用程序对 error 的处理大部分是判断 error 是否为 nil

如需将 error 归类,通常交给应用程序自定义,比如 kubernetes 自定义了与 apiserver 交互的不同类型错误

type StatusError struct {
    ErrStatus metav1.Status
}
var _ error = &StatusError{}

// Error implements the Error interface.
func (e *StatusError) Error() string {
    return e.ErrStatus.Message
}

defer

code

  • 函数返回之前执行某个语句或函数
    • 等同于 Java 和 C# 的 finally
  • 常见的 defer 使用场景: 记得关闭你打开的资源
    • defer file.Close()
    • defer mu.Unlock()
    • defer println("")

Panic 和 recover

  • panic: 可在系统出现不可恢复错误时主动调用 panic, panic 会使当前线程直接 crash
  • defer: 保证执行并把控制权交还给接收到 panic 的函数调用者
  • recover: 函数从 panic 或 错误场景中恢复
defer func() {
    fmt.Println("defer func is called")
    if err := recover(); err != nil {
        fmt.Println(err)
    }
}()
panic("a panic is triggered")