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

91 阅读2分钟

高质量编程

高质量:

  1. 正确性:边界清晰、正确处理一些边界情况
  2. 可靠性:鲁棒
  3. 简洁清晰

image.png

编码规范

众所周知,Go 是强迫症语言,所以能编译出来的代码基本都是格式化好了,因此 Google 的 Style Guide 里面并没有 Go 语言的 styleguide;

但是依然有的是关于编码大致模式和高效编程的一些指导,参考:styleguide | Style guides for Google-originated open-source projects (这个很简洁,几分钟就能读完)

中文版:Google Go 编程规范 | Google Style Guides

下面是一些比较重要的公共约定部分:

注释

  1. 公共符号始终要注释
  2. 不需要注释借口的实现方法

image.png

要求:

  1. 解释代码未表达出的上下文
  2. 解释代码何时会出错

代码格式

使用本地工具

命名规范

变量

  1. 越短越好
  2. 缩略词全大写
  3. 变量调用的位置越远,就要携带更尽可能多的上下文信息

函数

  1. 不必携带包名的content
  2. foo(这个变量一般用来表示一个未知的值,表示尚未确定,也是一种 placeholder) image.png

image.png

控制流程

避免嵌套,尽量减少缩进

实例:检测多个函数的错误的时候,有错误就提前返回

image.png

错误和异常处理

简单错误

image.png

warp

包装错误形成错误链 image.png

错误判定

image.png

  • 不能用 == 来判断错误, error.Is 可以用来检查错误链上是否有特定错误
  • error.As 可以将特定错误获取出来,和 .Is 的区别是能够拿出来判断

error

提供尽可能简明的错误

panic

用于真正异常的情况 听不懂 image.png

recover

  • 是在被 defer 的函数中使用的
  • 多个 defer 后进先出
  • 可以配合 log 记录当前调用栈

性能优化建议

获取建议:Benchmark

  • go test -bench=. -benchmem
  • 结果说明image.png

具体的建议:

  1. slice 预分配内存

原理:本质是对数据进行的指针、分配内存的操作

image.png

另一个建议是再创建子切片的时候使用 copy,让大内存尽量得到释放

性能调优实战