高质量编程
编程原则
简单性
可读性
生产力
编码规范
代码格式
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 语言优化