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

72 阅读3分钟

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


一、高质量编程

1-高质量编程简介

问题:什么是高质量? 答:编写的代码能够达到正确、可靠、简洁清晰的目标称之为高质量的代码

要做到以下几点:

  • 各种边界条件是否考虑完备
  • 异常情况处理,稳定性保证
  • 易读易维护

编程需做到:

  • 简单性:消除多余的复杂性,以简单清晰的逻辑编写代码,因为不好理解的代码无法修复改进。
  • 可读性:代码是写给人看的,而不是机器并且编写可维护代码的第一步是确保代码可读。
  • 生产力:团队整体的工作效率非常重要

如何编写高质量的Go代码?需要注意:

  • 代码格式:推荐使用gofmt自动格式化代码
    gofmt是Go语言官方提供的工具,能自动格式化Go语言代码为官方统一风格!
  • 注释 其中注释应该做到以下
    • 注释应该解释代码作用
    • 注释应该解释代码如何做的
    • 注释应该解释代码实现的原因
    • 注释应该解释代码什么情况会出错
    • 公共符号始终要注释
  • 命名规范
    • 核心目标是降低阅读理解代码的成本
    • 重点考虑上下文信息,设计简洁清晰的名称
  • 控制流程
    • 避免嵌套,保持正常流程清晰,例如出去冗余的else 实例如下:
  // Bad
    if foo{
       return x
    }else{
       return nil
 }
   // Good
    if foo{
       return x
 }
       return nil
  • 尽量保持正常代码路径为最小缩进
  • 故障问题的大多出现在复杂的条件语句和循环语句中
  • 错误和异常处理
    • 简单错误:指仅出现一次的错误,且在其他地方不需要捕获该错误
    • 优先使用errors.New来创建匿名变量来直接表示简单错误
    • 如果有格式化需求,则使用fmt.Errorf
    实例如下:
func defaultCheckRedirect(req *Request, via []*Request) error {
    if len(via) >= 10 { 
    // 使用errors.New 
        return errors.New("stopped after 10 redirects.") 
    } 
    return nil // 去掉不必要的else 
}

错误的WrapUnnwrap

  • 错误的Wrap实际上是提供了一个error嵌套另一个error的能力,从而生成一个error跟踪链
  • fmt.Errorf中使用%w 关键字来将一个错误关联至错误链中 实例如下:
list, _, err := c.GetBytes(cache.Subkey(a.actionID, "srcfiles")) 
if err != nil { 
    return fmt.Errorf("reading srcfiles list: %w", err) 
}
  • 错误判定:

    • 在错误链上获取特定种类的错误,用errors.ls 实例如下:
      
      data, err = lockedfile.Read(targ)
      if errors.Is(err, fs.ErrNotExist) {
          return []byte{}, nil
      }
      return data, err
      
      
  • panic:比错误更严重,表示程序无法正常工作,不建议在项目中使用,若问题可以被屏蔽或解决,建议使用error代替panic

  • recover:只能在defer的函数中使用,他是与panic对应,如果需要更多的上下文信息可以在recover后在log中记录当前的调用栈。


二、性能调优实战

1-性能调优简介

性能调优简介:

  • 性能优化的前提是满足正确可靠、简洁清晰等质量因素
  • 性能优化是综合评估,有时候时间效率和空间效率可能对立
  • 针对Go语言特性,介绍Go相关的性能优化建议

2- 性能分析工具

pprof工具的功能说明、实践应用以及采样过程和原理。