秋天的第一篇笔记|GO语言高质量编程与代码规范|青训营

69 阅读3分钟

代码是最好的注释,怎么写出高质量的GO代码?根据青训营的课记了一些笔记,希望能写出高可读性的代码.

高质量编程

啥是高质量编程?达到正确可靠,简洁清晰目标的代码

包括:

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

GO语言编程原则

简单性:

  • 以简单清晰的逻辑写代码
  • 避免无法理解的代码带来的难以修复和改进

可读性:

  • 写给人看的,要有可读性
  • 要进行维护首先要保证可读

生产力:

  • 团队整体工作效率很重要

编码规范

不同公司可能有不同的编码规范,其中有一些公共规范,下面逐一介绍.

代码格式

gofmt会自动格式化代码,一般的IDE都可配置或自带.

goimports实际上约等于gofmt加上依赖包管理

注释

如何写注释?注释应该做到:

  • 解释代码作用(如注释公共符号)
  • 解释代码如何做的(注释实现过程)
  • 解释实现的原因(解释外部因素,提供额外上下文)
  • 解释代码什么时候会出错(调用时的限制条件)

此外,公共符号始终要注释

  • 包里面声明的每个公共符号:变量,常量,函数以及结构都需要添加注释
  • 不明显 又不简短的公共功能要加注释
  • 库中的所有函数都必须加注释

(但有个例外,不用注释接口的实现方法)

命名规范

variable

  • 简洁>冗长

  • 缩略词全大写,但如果位于变量开头且不用导出,可用小写:

    • ServeHTTP而不是ServeHttp
    • XMLHTTPRequest/xmlHTTPRequest
  • 变量距离使用的地方越远,就越需要携带更多的上下文信息(比如全局变量)

function

  • 不用携带包名的上下文信息(因为使用时总是会成对出现)
  • 尽量简短的函数名(但要包含主要信息)
  • 函数类型和返回类型一致时可以省略类型信息
  • 函数类型和返回类型不一致时可加入返回类型信息

package

  • 只用小写字母,不用大写字母和下划线

  • 简短并包含一定上下文,如schema,task

  • 不要与标准库同名

  • 尽量满足以下规则:

    • 不用常用变量名
    • 用单数而不是复述
    • 谨慎使用缩写

控制流程

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

小结:

  • 线性原理,处理逻辑尽量走直线,避免复杂的嵌套分支
  • 正常流程代码沿着屏幕向下移动
  • 提升代码可维护性和可读性
  • 复杂条件和循环语句容易引起故障

错误和异常处理

简单错误--只出现一次的错误,且不用在其他地方捕获

  • 优先使用errors.New()来直接表示
  • 如果有格式化需求,使用mt.Errorf()

Wrap和Unwrap

提供了error嵌套error的能力,实现error的跟踪链.因为error可以嵌套,所以每次嵌套的时候,我们都可以提供新的错误信息,并且保留原来的error

fmt.Errorf中使用%w来将那个错误关联到错误链中

if err != nil {
        return fmt.Errorf("bar failed: %w", err)
}

errors.ls来判断是否是特定错误,可以对错误链进行判断

errors.As来获取错误链中特定错误

panic

panic可以中断原有的流程,如果函数调用panic,则会中断原有函数流程,转而执行defer.

  • 不建议在业务代码中使用
  • 如果程序启动时发生不可逆错误,可在initmain中使用panic

recover

让进入panicgoroutine恢复,如果在panic状态,会捕获panic的输入值,恢复正常执行.

  • 只能在有defer的函数中生效
  • 只在当前的goroutine生效
  • defer语句执行时后进先出