高质量编程
定义
- 编写的代码能够达到可靠正确、简洁清晰的目标
- 各种边界条件是否考虑完备
- 异常情况处理、稳定性保证
- 易读易维护
编码规范
- 代码格式
gofmt自动格式化代码 - 注释
解释代码作用、如何做、实现原因、出错情况适合注释公共符号、实现过程、解释代码的外部因素、提供额外上下文、解释代码的限制条件 - 命名规范
变量简洁胜于冗长
函数名尽量简短,不需携带包的上下文信息
包名由小写字母构成,简短且包含一定的上下文信息 - 控制流程
避免嵌套,保持正常流程清晰 尽量保持正常代码路径为最小缩进 - 错误和异常处理
优先使用errors.New来创建匿名变量来直接表示简单错误
使用errors.ls判定一个错误是否为特定错误,使用errors.As来在错误链上获取特定种类的错误
性能优化
Benchmark
建议
- slice尽可能在make()初始化切片时提供容量信息
- 使用copy代替re-slice减少大内存未释放的问题
- map预分配内存,减少内存拷贝和Rehash的消耗
- 使用strings.Buffer拼接字符串
- 使用空结构体节省内存
- 使用atomic包,通过硬件实现,提升效率
性能调优实战
pprof
- topN可查看占用资源最多的函数
- list可根据指定的正则表达式查找代码行
- web可调用关系可视化
- goroutine可根据火焰图进行分析
- Block阻塞采样阻塞操作的次数和耗时
- Mutex锁竞争采样抢锁的次数和耗时
总结
性能调优原则
要靠数据而不是猜测,保证正确性,定位主要瓶颈