一、高质量编程
1.简介
什么是高质量?
编写的代码能够达到正确可靠、简洁清晰的目标可称之为高质量代码。主要考虑以下三个方面:
- 各种边界条件是否考虑完备
- 异常情况处理,稳定性保证
- 易读易维护
Go 语言开发者 Dave cheney的高质量编程的原则:
编程原则
实际应用场景很多,各种语言的特性和语法各不相同,但是高质量编程所遵循的原则是相通的。
简单性
- 消除“多余的复杂性”,以简单清晰的逻辑编写代码
- 不理解的代码无法修复改进
可读性
- 代码是写给人看的,而不是机器
- 编写可维护代码的第一步是确保代码可读
生产力
- 团队整体工作效率非常重要
2.编码规范
2.1编程规范-原则
如何编写高质量的Go 代码:
- 代码格式
- 注释
- 命名规范
- 控制流程
- 错误和异常处理
2.2编程规范-注释
公共符号始终要注释
- 包中声明的每个公共的符号:变量、常量、函数以及结构都需要添加注释
- 任何既不明显也不简短的公共功能必须予以注释
- 无论长度或复杂程度如何,对库中的任何函数都必须进行注释
2.3编程规范-代码格式
推荐使用 gofmt自动格式化代码
1.gofmt
Go 语言官方提供的工具,能自动格式化 Go 语言代码为官方统一风格。
常见IDE都支持方便的配置
2.goimports
也是Go 语言官方提供的工具
实际等于gofmt加上依赖包管理
自动增删依赖的包引用、将依赖包按字母排序并分类
Good code has lots of comments, bad code requires lots of comments ——Dave Thomas and Andrew Hunt
- 注释应该做的
- 注释应该是解释代码作用的
- 注释应该解释代码如何做的
- 注释应该解释代码实现的原因
- 注释应该解释代码什么情况会出错
2.4 编程规范-命名规范
variable
- 简洁胜于冗长
- 缩略词全大写,但当其位于变量开头且不需要导出时,使用全小写
- 例如使用SegveHTTP而不是ServeHttp
- 使用XMLHTTPRequest或者xmIHTTPRequest
- 变量距离其被使用的地方越远,则需要携带越多的上下文信息
- 全局变量在其名字中需要更多的上下文信息,使得在不同地方可以轻易辨认出其含义
function
- 函数名不携带包名的上下文信息,因为包名和函数名总是成对出现的
- 函数名尽量简短
- 当名为foo的包某个函数返回类型Foo时,可以省略类型信息而不导致歧义
- 当名为foo的包某个函数返回类型T时(T并不是Foo),可以在函数名中加入类型信息
package
- 只由小写字母组成。不包含大写字母和下划线等字符
- 简短并包含一定的上下文信息。例如
schema、task等 - 不要与标准库同名。例如不要使用
sync或者strings
2.5 编码规范-控制流程
- 避免嵌套,保持正常流程清晰
- 尽量保持正常代码路径为最小缩进
2.6 编码规范-错误和异常处理
简单错误
- 简单的错误指的是仅出现一次的错误,且在其他地方不需要捕获该错误
- 简单的错误指的是仅出现一次的错误,且在其他地方不需要捕获该错误
优先使用
errors.New来创建匿名变量来直接表示简单错误 - 如果有格式化的需求,使用
fmt.Errorf
二、性能优化
1.简介
- 性能优化的前提是满足正确可靠、简洁清晰等质量因素
- 性能优化是综合评估,有时候时间效率和空间效率可能对立
- 针对Go语言特性,介绍Go相关的性能优化建议
2.使用Benchmark
- 性能表现需要实际数据衡量
- Go 语言提供了支持基准性能测试的benchmark工具
3.使用slice
slice预分配内存
- 尽可能在使用
make()初始化切片时提供容量信息
三、性能优化分析工具
1.简介
性能调优原则
- 要依靠数据不是猜测
- 要定位最大瓶颈而不是细枝末节
- 不要过早优化
- 不要过度优化
2.性能分析工具 pprof
pprof是用于可视化和分析性能分析数据的工具。
功能介绍:
四、性能调优案例
本节课讲三个性能调优案例:
1.业务服务优化;
2.基础库优化;
3.Go 语言优化
里面用到了很多工具和分析方法,很值得好好学习。
五、引用参考
- 字节青训营内部课