这是我参与【第五届青训营】伴学笔记创作活动的第3天,今天主要了解高质量编程与性能调优实战。
高质量编程
代码正确可靠、简洁清晰。
编程原则:
-
简单性:以简单清晰的逻辑编写代码
-
可读性:编写可维护代码的第一步是确保可读性
-
生产力:团队整体工作效率非常重要
编码规范
-
代码格式:推荐使用gofmt(Go语言官方提供的统一风格的工具)自动格式化代码。
-
注释:公共函数要注释,以及注释应该解释代码作用,如何做的,实现原因,出错情况
-
命名规范:缩略词全大写,但是在变量开头且不用导出时,使用全小写;变量距离其被使用的地方越远,则需要携带的上下文越多
//Bad
for index:=0;index<len(s);index++{
}
//Good
for l := 0;l<len(s);l++{
}
//此处l和index作用相同,所有应该以简便为主要标准
-
控制流程
- 避免嵌套,保持正常流程清晰
- 尽量保持正常代码路径为最小缩进
- 提升代码可维护性和可读性
-
错误和异常处理
- 仅出现一次的错误优先使用
errors.New来创建匿名变量来表示 - 错误的Wrap实际上是提供一个error嵌套另一个error
- 判断一个错误是否为特定错误使用error.Is,在错误链上获取特定种类错误,使用error.As
- panic用于真正异常的情况
- recover生效范围,在当前goroutine的被defer的函数中生效
- 仅出现一次的错误优先使用
性能优化
性能优化建议:Benchmark(Go语言提供的支持基准性能测试工具)
func BenchmarkFib10(b *testing.B){
for n:=0;n<b.N;n++{
Fib(10) //函数
}
}
结果中会显示每次执行花费时间,申请多大内存,申请几次内存等
性能优化建议:Slice,尽可能在使用make()初始化切片时提供容量信息
缺点:大内存得不到释放,可以用copy替代re-slice
性能优化建议:map(提前预估好需要的空间)
性能优化建议:字符串处理
使用strings.Builder
func ByteBuffer(n int ,str string)string{
buf:=bew(bytes.Buffer)
for i:=0;i<n;i++{
buf.WriteString(str)
}
return buf.String()
}
性能优化建议:空结构体(节省内存)
性能优化建议:atomic包(硬件实现)
性能分析工具:pprof(用于可视化和分析性能分析数据),后面均实战内容,可以跟文档动手操作一遍最好。