青训Day4:高质量编程及编码规范|青训营笔记

68 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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 性能调优案例-业务服务优化

image.png

流程
·建立服务性能评估手段
·分析性能数据,定位性能瓶颈
·重点优化项改造
·优化效果验证

建立服务性能评估手段
·服务性能评估方式
·请求流量构造
·压测范围
·性能数据采集