Go语言高质量编程学习笔记 | 青训营

60 阅读3分钟

高质量编程

简介

  1. 高质量:正确可靠,简洁清晰
    1. 边界条件是否考虑完备
    2. 异常情况处理,稳定性保证
    3. 易读易维护
  2. 原则:简单性,可读性,生产力

编码规范

  • 如何编写高质量Go代码
    • 代码格式
    • 注释
    • 命名规范
    • 控制流程
    • 错误和异常处理
  1. 代码格式:gofmt自动格式化代码

  2. 注释

    • 公共符号始终要注释(包中声明的每个公共符号:变量,常量,函数以及结构都需要添加注释)

    • 任何既不明显也不简短的公共功能必须予以注释

    • 无论长度或复杂程度如何,对库中任何函数都必须进行注释

    • 例外:不需要注释实现接口的方法如图

      1

    • 注释应该做的

      1. 解释代码作用
      2. 解释代码如何做的
      3. 解释代码实现原因
      4. 解释代码什么情况会出错

    小结

    • 代码是最好的注释

    • 注释应该提供代码为表达出的上下文信息

  3. **命名规范 **

    • 简洁胜于冗长
    • 缩略词全大写,担当起位于变量开头且不需要导出时使用全小写
      • 例如使用ServerHTTP而不是ServerHttp
      • 使用XMLHTTPRequest或者xmlHTTPRequest
    • 变量距离其被使用的地方越远,则需要携带越多的上下文信息
      • 全局变量在其名字中需要更多的上下文件信息,使得在不同的地方可以轻易辨认出其含义

    小结:

    1. 核心目标是降低阅读理解代码的成本
    2. 重点考虑上下文信息,设计简洁清晰的名称

    2

  4. 控制流程

    • 避免嵌套,保持正常流程清晰
    • 尽量保持正常代码路径为最小缩进
      • 优先处理错误情况/特殊情况,今早返回或继续循环来减少嵌套

    小结:

    1. 线性原理,处理逻辑尽量走直线,避免复杂的嵌套分支
    2. 正常流程代码沿着屏幕向下移动
    3. 提升代码的可维护性和可读性
    4. 故障问题大多出现在复杂的条件语句和循环语句中

错误和异常处理

  • 简单错误

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

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

    • 在fmt.Errorf中使用:%w关键字来将一个错误关联至错误链中

      3

  • 错误判定

    • 判定一个错误是否为特定错误,使用error.ls

    • 不同于使用==。使用该方法可以判定错误链上所有错误是否含有特定的错误

      4

    • 在错误链上获取特定种类的错误使用errors.As

      5

    • panic

      6

    • recover

      • recover只能在被defer的函数中使用
      • 嵌套无法生效
      • 只在当前goroutine生效
      • defer的语句是后进先出
      • 如果需要更多的上下文信息,可以recover后在log中记录当前的调用栈

      7

      小结

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