常用语法
错误处理
- 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
- 函数返回之前执行某个语句或函数
- 等同于 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")