高质量编程 | 青训营笔记

76 阅读2分钟

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

高质量编程

  • 高质量:编写的代码能够达到准确可靠、简洁清晰的目标
    • 各种边界条件是否考虑晚辈
    • 异常情况处理,稳定性保证
    • 易读易维护
  • 编程原则 实际应用场景千变万化,各种语言的特性和语法各不相同,但是高质量编程遵循的原则是相通的
    • 简单性:消除“多余的复杂性”,以简单清晰的逻辑编写代码;不理解的代码无法修复改进
    • 可读性:代码是给人看的,不是给机器看的;编写可维护代码的第一步是确保代码可读
    • 生产力:团队整体工作效率非常重要
  • 编码规范
    • 代码格式
      • gofmt自动格式化代码
      • goimports=gofmt+依赖包管理
    • 注释:公共符号始终要注释,解释代码作用、代码是如何做的、代码出现原因,提供代码未表达出的上下文信息
    • 命名规范:降低阅读理解成本,考虑上下文信息,设计简洁清晰的名称
    • 控制流程
      • 避免嵌套,保证正常流程清晰
      • 优先处理错误情况/特殊情况
    • 错误和异常处理
      • 优先使用errors.New创建匿名变量直接表示简单错误,如有格式化要求,使用fmt.Errorf;
      • 复杂的错误使用Wrap和UnWarp
      • 判断一个错误是否为特定错误, errors.ls
      • 在错误链上获取某种特定类型的错误,errors.As
      • 发生不可逆转的错误时,使用Panic(不建议在业务代码中用)
      • 在发生错误时,获取错误信息,recover

性能调优

性能优化的前提是满足正确可靠、简洁清晰等质量因素,性能优化是综合评估,有时时间效率和空间效率可能对立

  • 性能优化建议
    • Benchmark:性能测试工具
    • Slice:预分配内存
      • 尽可能在make()初始化切片时提供容量信息
      • 大内存未释放:使用copy代替re-slice
      • map预分配内存
      • 使用strings.Builder处理字符串拼接等操作
      • 使用空结构体节省内存,例如用map实现set
      • 多线程形况下使用atomic包进行原子操作,效率比锁高
  • 性能调优原则
    • 要依靠数据而不是猜测
    • 定位最大瓶颈而不是细枝末节
    • 不要过早优化
    • 不要过度优化
  • 性能分析工具 pprof