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

51 阅读2分钟

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

编码规范

1、代码格式

推荐使用 gofmt 自动化格式化代码 image.png

2、注释

  1. 注释应该怎么做:① 解释代码 ② 解释代码如何做的 ③ 解释代码实现的原因 ④ 解释代码什么情况会出错

3、命名规范

  1. 变量 image.png
  2. 函数 image.png
  3. image.png

4、控制流程

  1. 避免嵌套,保证正常流程清晰
  2. 尽量保持正常代码路径为最小缩进 image.png

5、错误和异常处理

  1. 简单错误
    1. 仅出现一次的错误
    2. 使用 errors.New("[要输出的信息]")
    3. 如果需要格式化,用 fmt.Errof image.png
  2. 错误的 Wrap 和 Unwrap
    1. 提供了一个 error 嵌套另一个 error 的能力,从而生成一个 error 的跟踪链
    2. fmt.Errorf() 中使用 %w 关键字来将一个错误关联至错误链中 image.png
  3. 错误判断
    1. errors.Is():判断是否为特定错误
    2. ==:判断错误链上的错误是否含有特定错误 image.png
    3. errors.As():在错误链上获取特定种类的错误
  4. panic:当程序启动阶段发生不可逆的错误时,可以在 init 或 main 函数中使用 panic
  5. recover
    1. 只能在被 defer 的函数中使用
    2. 嵌套无法生效
    3. 只能在 goroutine
    4. defer 的语句是后进后出 image.png
    5. 在 recover 后加 log:记录当前的调用栈(得到上下文信息)

性能优化

  1. Benchmark
    go test -bench=. -benchmem image.png
  2. slice
    1. 预分配内存,在使用 make() 初始化切片时提供容量信息 image.png
    2. 用 copy 替代 re-slice image.png
  3. map
    1. map 预分配内存 image.png
    2. 分析:
      1. 不断向 map 中添加元素操作会触发 map 操作
      2. 提前分配好空间可以减少内存靠别和 Rehash 的消耗
      3. 提前预估需要的空间
  4. 字符串处理
    1. strings.Builder image.png
    2. 性能比较:strings.Builder > bytes.Buffer > +
    3. 预分配内存 image.png
  5. 空结构体
    1. 不占用任何空间
    2. 可作为占位符 image.png
    3. 实现 set 可以考虑用 map 来代替
  6. atomic image.png image.png

pprof

golang pprof 实战 | Wolfogre's Blog
gitib项目:wolfogre/go-pprof-practice: go pprof practice. (github.com)
参考:golang pprof 实战 | Wolfogre's Blog

  1. 使用
    1. 终端运行程序 go run main.go
    2. 进行排场
      go tool pprof http://localhost:6060/debug/pprof/profile
    3. 输入 top
  2. 参数说明 image.png Flat == Cum,函数中没有调用其他函数
    Flat == 0.函数中只有其他函数的调用
  3. pprof 总结 image.png 啊啊啊啊啊啊啊听不懂"quq"