Go 高质量编程与性能调优 | 青训营笔记

37 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 3天

一、高质量编程:

高质量编程简介

高质量代码

  • 各种边界条件考虑完备
  • 异常情况处理,稳定性保证
  • 易读易维护

编程原则

  • 简单性:简单清晰的逻辑
  • 可读性:确保代码可读
  • 生产力:团队整体工作效率非常重要

编码规范

代码格式

推荐自动格式化代码

注释

公共符号始终要注释

  • 解释代码作用
  • 解释代码如何做的
  • 解释代码实现的原因
  • 解释代码什么情况会出错

命名规范

  • 注意变量的作用域来确定变量名表达的信息量
  • package 只由小写字母组成,不可与标准库同名
  • 重点考虑上下文信息,设计简洁清晰的名称

控制流程

  • 保持正常代码路径为最小缩进,优先处理错误情况来减少嵌套
  • 故障问题大多出现在复杂的条件语句和循环语句中

错误和异常处理

error

  • 简单错误:仅出现一次且不被其他地方捕获的错误用errors.New表示
  • fmt.Errorf生成error错误链,方便定位error
  • 判定一个错误是否为特定错误:errors.Is
  • 在错误链上获取特定种类的错误:errors.As

panic

  • 当程序启动阶段发生不可逆转的错误时,可以在init或main函数中使用panic
  • 若问题可以被屏蔽或解决,使用error代替panic

recover

  • 嵌套无法生效
  • 生效范围在当前goroutine的被defer的函数中生效

性能优化建议

Benchmark

go test -bench. -benchmem

uTools_1674051877213.png

Slice

  • 预分配空间效率更高
  • 切片操作并不复制切片指向的元素
  • 创建一个新的切片会复用原来切片的底层数组
  • 使用从copy代替re-slice,防止大切片被小切片引用而不能释放
  • map与slice类似

字符串

  • 拼接:strings.Builder<bytes.Buffer< +
  • 使用+拼接,每次都会重新分配内存,其余两种不会

空结构体

  • 空结构体struct{}实例不占据任何内存空间
  • 空结构体本身具备很强的语义,不需要任何值,仅作为占位符
  • Set可以由map代替,只使用map的键,不用值

atomic/mutex

  • 硬件实现,效率比锁高。锁的实现属于系统调用
  • sync.Mutex,应该用来保护一段逻辑,不仅仅保护一个变量

二、性能优化实战

性能分析工具pprof

简介

uTools_1674054566888.png

pprof-排查实战

  • 项目提前埋入一些炸弹代码,产生可观测的性能问题
  • CPU、堆内存、协程、锁、阻塞均有涉及

性能调优案例

从业务服务优化、基础库优化、Go语言优化三个方面展开

三、课后个人总结:

高质量编码需要大量的积累,我平常写代码尽量符合高质量编程原则,养成好的编码习惯,此外性能分析工具pprof需要在实战一步步掌握排查方法,仅仅靠一个案例是不够的。我会反复夯实基础课程,为后面的进阶课程做好准备。