学习目标
- 编写更简洁清晰的代码
- 了解常用Go语言程序的优化手段
- 熟悉Go程序性能分析工具
- 了解工程中性能优化的原则和流程
1 高质量编程
1.1 简介
- 高质量代码:编写的代码能够达到正确可靠、简介清晰的目标
- 各种便捷条件是否考虑完备
- 异常情况处理,稳定性保证
- 易读易维护
1.2 编码规范
如何编写高质量的Go代码
- 代码格式
- 注释
- 命名规范
- 控制流程
- 错误和异常处理
1.2.1 代码规范-代码格式
gofmt官方提供的自动格式化代码 goimports可以自动增删依赖包引用,并将依赖包按照字母排序并分类
1.2.2 编码规范-注释
注释应该提供代码未表达出的上下文信息:
- 解释代码作用
- 解释代码如何做的
- 解释代码实现原因
- 解释代码什么情况会出错
公共符号始终要注释:
- 包中声明的每个公共的符号:变量、常量函数以及结构都需要注释
- 任何即不明显也不简短的公共功能必须注释
- 无论长度或复杂程度如何,对库中的任何函数都必须进行注释
好的代码有很多注释,坏的代码需要很多注释。
1.2.3 编码规范-命名规范
varilable变量命名
- 简介胜于冗长
- 缩略词全大写,但当其位于变量开头且不需要导出时,使用全小写
- 例如使用ServeHTTP而不是ServeHttp
- 使用XMLHTTPRequest 或者 xmlHTTPRequest
- 变量距离被使用的地方越远,则需要携带越多的上下文信息
- 全局变量在其名字中需要更多的上下文信息,使得在不同的地方可以轻易辨认出其含义
function 函数命名
- 函数名不携带包名的上下文信息,因为包名赫尔函数名总是成对出现的
- 函数名尽量简短
- 当函数返回类型和包名一致时,可以省略类型信息而不导致歧义
- 当函数返回类型和包名不一致时,可以在函数名中加入类型信息
package包命名
- 只由小写字母组成。不包含大写字母和下划线等字符
- 简短并包含一定的上下文信息
- 不要与标准库同名
1.2.4 编码规范-控制流程
- 避免嵌套,保持正常流程清晰
- 尽量保持正常代码路径为最小缩进(优先处理错误情况/特殊情况,尽早返回减少嵌套)
1.2.5 编码错误-错误和异常处理
简单错误(指仅出现一次的错误,且在其他地方不需要捕获该错误):
- 优先使用
error.New来创建匿名变量来直接表示简单错误并返回- 如果有格式化的需求,使用
fmt.Errorf
错误的Wrap和Unwrap
- 错误的wrap实际上是提供了一个error嵌套另一个error的能力,从而生成一个errer的跟踪链
- 在fmt.Errorff中使用:%W关键字来将一个错误关联至错误链过
erroes.Is()方法可以判定错误链上的所有错误是否含有特定错误errors.As()方法 可以获取特定种类的错误
recover
- recove只能在被defer的函数中使用
- 嵌套无法生效
- 只在当前goroutine生效 defer的语句是后进先出