高质量编程与性能调优实战 | 青训营

52 阅读2分钟

高质量编程

编程原则

简单性

可读性

生产力

编码规范

代码格式

gofmt 官方工具

goimports 官方工具

注释

包中的公共符号 - 变量、常量、函数、结构等

公共功能

库中函数

(但避免注释实现接口的方法)

  • 代码作用
  • 代码实现方式
  • 代码实现原因
  • 代码报错原因
  • 总 | 表达的上下文信息

命名规范

  • 变量

简洁命名

缩略词一般大写

变量愈范围广愈加需要更多上下文信息

  • 函数

函数名简短

根据需要在包的函数中加入类型信息

仅由小写字母构成

简短并包含足够的上下文信息

避免和标准库同名

尽量避免常用变量名

使用单数

谨慎使用缩写

控制流程

避免嵌套,保证正常流程清晰

尽量保证正常代码路径为最小缩进

错误及异常处理

简单错误 优先使用 errors.New 创建,错误格式化打印使用 fmt.Errorf

利用 %w 参数使错误关联至错误链中

错误判定使用 errors.Is 函数

获取特定类型错误,使用 errors.As

避免在业务代码中使用 panic,一般仅用于 main 函数和 init 函数

recover 函数 - 仅在 defer 函数中使用,defer 语句后进先出,仅当前 goroutine 生效,嵌套无效

可利用 debug.stack 函数获取当前调用栈

性能优化建议 - benchmark

go 内置的 benchmark 工具

go test -bench=/ -benchmem

结果 - 测试函数名 执行测试次数 单次执行花费时间 单次执行申请内存容量 单次执行申请内存次数

  • slice 预分配内存 - 在使用 make 函数时提前指定容量
  • 大内存未释放 - 利用 copy 替代 reslice
  • map 预分配内存
  • 利用 strings.Builder 或 bytes.Buffer 拼接字符串,利用实例上的 grow 方法预先分配内存
  • 利用空结构体节省空间 - 作为占位符使用
  • 使用 atomic 包 - 替代 sync.Mutex

性能调优实战

简介

性能调优原则

依赖数据而非猜测

定位最大瓶颈而非细枝末节

避免过早优化

避免过度优化

性能分析工具 pprof

分析程序内存及Memory耗费

可视化及分析性能分析数据

性能调优案例

  • 业务服务优化
  • 基础库优化
  • Go 语言优化