go基本规范 | 青训营

66 阅读2分钟

go规范

参考 《golang pprof 实战》代码实验用例。 《Go性能分析工具》代码实验用例。

注释

命名规范

  • function命名时

    • 报名 time
    • 函数不要使用 TimeNow,使用Now即可
  • 报名全小写字母

控制

  • if-else else可能多余

错误处理

  • errors && Errorf

    • 简单的错误指的是仅出现一次的错误,且在其他地方不需要捕获该错误
    • 优先使用errors.New()来创建匿名变量来直接表示简单错误
    • 如果有格式化的需求,使用fmt.Errorf()
  • Wrap和Unwrap

    • 错误的Wrap实际上是提供了一个error嵌套另一个error的能力,从而生成一个error的跟踪链
    • 在fmt.Errorf中使用:%w 关键字来将一个错误关联至错误链中 return fmt. Errorf("reading srcfiles list:%w", err)
  • 错误判定

    • 判定一个错误是否为特定错误,使用errors.Is
    • 不同于使用==,使用该方法可以半判定错误链上的所有错误是否含有特定的错误
    • 在错误链上获取特定种类的错误,使用errors.As

panic

  • 不建议在业务代码中使用panic
  • 调用函数不包含recover会造成程序崩溃
  • 若问题可以被屏蔽或解决,建议使用error代替panic
  • 当程序启动阶段发生不可逆转的错误时可以在init或main函数中使用panic

recover

  • recover只能在被defer的函数中使用

  • 嵌套无法生效

  • 只在当前goroutine生效

  • defer 的语句是后进先出

  • 如果需要更多的上下文信息,可以recover后在log中记录当前的调用栈

    defer func(){
        if e := recover(); e ! nil {
            f = nil 
            err fmt. Errorf("gitfs panic:%v\n%s",e, debug.Stack())
        }
    }()
    

小结

  1. error尽可能提供简明的上下文信息链,方便定位问题
  2. panic用于真正异常的情况
  3. recover生效范围,在当前goroutine的被defer的函数中生效