高质量编程与性能优化 | 青训营笔记

42 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天

高质量编程

  • 编程原则

    • 简单性
    • 可读性
    • 生产力
  • 如何编写高质量的Go代码

    • 代码格式

    • 注释

      • 注释应该解释代码作用
      • 注释应该解释代码是如何做的
      • 注释应该解释代码实现的原因
      • 注释应该解释代码什么情况下会出错
      • 对暴露出的公共部分,进行说明
      • 代码是最好的注释,注释应该提供代码未表达出的上下文信息
    • 命名规范

      • 简介胜于冗长

      • 缩略词全大写,当其位于变量开头且不需要导出时,使用全小写

        • ServeHTTP而不是ServeHttp
        • 使用XMLHTTPRequest或着xmlHTTPRequest
      • 变量距离其被使用的地方越远,则需要携带越多的上下文信息

      • 全局变量在其名字中需要更多的上下文信息,使得在不同地方可以轻易辨认出其含义

      • 函数名不携带包名的上下文信息,因为包名和函数名总是成对出现的

      • 函数名尽量简短

    • 控制流程

      • 如果两个分支中都含有return,则可以省去冗余的else
      • 优先处理错误情况或特殊情况,尽早返回或继续循环来减少嵌套
    • 错误和异常处理

      • 简单错误

        • 优先使用errors.New来创建匿名变量来直接表示简单错误,
        • 如果有格式化的需求,使用fmt.Errorf
      • 错误的Wrap和Unwrap

        • 错误的Wrap实际上提供了一个error嵌套另一个error的能力,从而生成一个error的跟踪链
      • errors.As

      • panic

      • recover

      • 错误小结:error尽可能提供简明的上下文信息链,方便定位问题

        • panic用于真正异常的情况
        • recover生效范围,在当前goroutine的defer函数中生效

性能优化

  • 性能优化的前提是满足正确可靠、简介清晰等质量因素
  • 切片:尽可能在使用make()初始化切片是提供初始容量信息,
  • map预分配内存
  • 字符串拼接时+操作比strings.Builder耗时,strings.Builder比bytes.Buffer更快
  • 空结构体不占用任何空间
  • 多线程实现线程安全时推荐使用atomtic包,效率比锁高

普通应用代码,不要一味地追求程序性能

  • 原则:

    • 要依靠数据不是猜测
    • 要定位最大瓶颈而不是细枝末节
    • 不要过早优化
    • 不要过度优化
  • 性能调优工具:pprof