Go语言-高质量编程与性能调优实战 | 青训营笔记

161 阅读4分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记。

高质量编程

编写的代码能够达到正确可靠、简洁清晰的目标可称之为高质量代码。

  • 边界条件考虑完备
  • 异常处理,稳定性保证
  • 易读易维护(别人易读) Go语言需要:
  • 简单性(多余的复杂性,以简单清晰的逻辑编码,后续可理解)
  • 可读性(为了后期维护)
  • 生产力(团队整体工作效率)

1.1 编码规范

代码格式:推荐使用gofmt自动格式化代码为官方统一风格;goinmports也是官方工具,等于gofmt加上自动增删依赖的包引用、将依赖包按字母排序分类 注释

代码是最好的注释。
应解释的内容:(1)代码作用 (2)代码实现过程 (3)代码实现的原因,如适合代码的外部因素,上下文 (4)代码的限制条件

公共符号始终要注释,比如变量、常量、函数以及结构,公共功能必须,函数必须。

命名规范:核心目标是降低阅读理解代码的成本
变量:

  • 简洁
  • 缩略词全大写,变量开头且不需要导出时全小写。ServeHTTP。XMLHTTPRequest或xmlHTTPRequest。
  • 变量距离其被使用的地方越远(更需要辨认含义),则需要携带越多的上下文信息。而for循环中写i最好,写index就不好。提供外部调用的函数形参命名不要省略意义,deadline比t好。

函数:

image.png

package:

image.png

控制流程:

image.png image.png

错误和异常处理

  • 简单错误:只出现一次的错误 优先使用匿名变量:\
if xxx {
    return errors.New("stopped after 10 redirects")
}

如果有格式化的需求,使用fmt.Errorf

  • 错误的 Wrap和Unwrap wrap是错误的嵌套,生成error的跟踪链。%w关键字关联一个错误至错误链。fmt.Errorf("reading srcfiles list: %w", err)
  • 错误判定

errors.Is判断是否指定类型error image.png

errors.As取出特定种类错误 image.png

  • panic

image.png 此例子是业务中遇到报错就无法,也不用进行的例子,消费队列的消费组如果启动失败,就会用panic——panic用于真正异常的情况

  • recover 不太懂,只在当前goroutine的被defer的函数中生效

1.2 性能优化建议

Go 性能调优

性能调优

综合评估 时间效率和空间效率不可兼得。
原则:依靠数据,定位最大瓶颈而不是细枝末节,不要过早优化,不要过度优化。

Benchmark是用数据衡量Go语言基准性能的工具 go test -bench=. -benchmem

image.png

性能优化建议:

  • slice预分配内存:(1)尽量在使用make初始化切片时提供容量信息,避免内存反复分配。当len超过cap会进行扩容。 (2)用Copy代替re-slice,释放大内存。在已有切片基础上创建切片,不会创建新的底层数组。原切片较大时,用copy新建小切片。

image.png

image.png

image.png

  • map预分配内存同理。初始化时写size。
  • 使用strings.Builder

image.png

image.png

使用+性能最差,string.builder和bytes.Buffer相近。+会每次重新分配内存。而后两者底层都是[]byte数组,有内存扩容策略,不需要每次拼接重新分配内存。Buffer更快的原因是

image.png

用grow提前分配空间,更加优化。

image.png

  • 使用空结构体可以节省内存,因为不占据任何空间,可以作为占位符。

  • atomic包

image.png

性能分析工具 pprof

用于可视化和分析性能分析数据。

功能简介

image.png

实践项目

运行,通过浏览器查看指标http://localhost:6060/debug/pprof/

image.png

go tool pprof "http://localhost:6060/debug/pprof/profile?seconds=10"

image.png topN查看占用资源最多的函数

image.png

Flat== Cum, 函数中没有调用其他的函数 Flat==0,函数中只用其他函数的调用

list Eat 定位哪里有问题

image.png 消耗最大的是for那一行

web调用关系可视化

image.png

排查Heap-堆内存 go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/heap" 打开一个页面,展示调用时内存最大的函数。图显示异常要先安装一个东西。 可以切换各种图,各种数据。

goroutine-协程 go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/goroutine"

mutex-锁 改后缀mutex

block-阻塞

pprof采样原理。

性能调优案例