代码是最好的注释,怎么写出高质量的GO代码?根据青训营的课记了一些笔记,希望能写出高可读性的代码.
高质量编程
啥是高质量编程?达到正确可靠,简洁清晰目标的代码
包括:
- 边界条件的完备考虑
- 异常情况的处理,稳定性保证
- 易读易维护
GO语言编程原则
简单性:
- 以简单清晰的逻辑写代码
- 避免无法理解的代码带来的难以修复和改进
可读性:
- 写给人看的,要有可读性
- 要进行维护首先要保证可读
生产力:
- 团队整体工作效率很重要
编码规范
不同公司可能有不同的编码规范,其中有一些公共规范,下面逐一介绍.
代码格式
gofmt会自动格式化代码,一般的IDE都可配置或自带.
goimports实际上约等于gofmt加上依赖包管理
注释
如何写注释?注释应该做到:
- 解释代码作用(如注释公共符号)
- 解释代码如何做的(注释实现过程)
- 解释实现的原因(解释外部因素,提供额外上下文)
- 解释代码什么时候会出错(调用时的限制条件)
此外,公共符号始终要注释
- 包里面声明的每个公共符号:变量,常量,函数以及结构都需要添加注释
- 不明显 又不简短的公共功能要加注释
- 库中的所有函数都必须加注释
(但有个例外,不用注释接口的实现方法)
命名规范
variable
-
简洁>冗长
-
缩略词全大写,但如果位于变量开头且不用导出,可用小写:
ServeHTTP而不是ServeHttpXMLHTTPRequest/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.
- 不建议在业务代码中使用
- 如果程序启动时发生不可逆错误,可在
init或main中使用panic
recover
让进入panic的goroutine恢复,如果在panic状态,会捕获panic的输入值,恢复正常执行.
- 只能在有
defer的函数中生效 - 只在当前的
goroutine生效 defer语句执行时后进先出