这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天。
1. 高质量编程
1.1 简介
什么是高质量:编写的代码能够达到正确可靠、简洁清晰的目标
·各种边界条件是否考虑完备
·异常情况处理,稳定性保证
·易读易维护
如何编写高质量的Go代码
·代码格式
·注释
·命名规范
·控制流程
·错误和异常处理
推荐使用gofmt自动格式化代码
注释应该做的
·代码作用
·代码如何做
·实现原因
·什么情况会出错
1.2.3 编码规范-命名规范
variable
·简洁胜于冗长
·缩略词全大写,但当其位于变量开头且不需要导出时,使用全小写
·变量距离其被使用的地方越远,则需要携带越多上下文信息
尽量保持正常代码路径为最小缩进
· 有限处理错误情况/特殊情况,尽早返回或继续循环来减少嵌套
简单错误:
优先使用errors.New来创建匿名变量来直接表示简单错误
Wrap和Unwrap,错误调用方提供上下文信息
error.Is()
errors.As()
不建议在业务代码中使用panic
·error尽可能提供简明的上下文信息链,方便定位问题
·panic用于真正异常的情况
·recover生效范围,在当前goroutine的贝defer的函数中生效
defer在函数返回前调用,后进先出
1.3 性能优化建议
Go提供了支持基准性能测试的benchmark工具
go test -bench=. -benchmem
1.3.2 Slice
slice预分配内存
·尽可能使用make()初始化切片时提供容量信息
使用strings.Builder
·字符串在Go语言中是不可变类型,内存占用大小固定,每次+都会重新分配内存
·Builder和Buffer底层都是[]byte,内存扩容策略,不需要每次重新分配内存。Grow()方法
使用atomic包代替使用Lock
2. 性能调优实战
性能调优原则
·依靠数据而不是猜测
·要定位最大瓶颈而不是细枝末节
·不要过早优化(防止修改需求)
·不要过度优化(防止无法兼容)
2.2 性能分析工具pprof
2.3.1 性能调优案例-业务服务优化
流程
·建立服务性能评估手段
·分析性能数据,定位性能瓶颈
·重点优化项改造
·优化效果验证
建立服务性能评估手段
·服务性能评估方式
·请求流量构造
·压测范围
·性能数据采集