这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记.
一、高质量编程
1.1 高质量编程简介
- 什么是高质量? 编写代码达到正确可靠,简洁清晰
- 边界条件是否完备
- 异常情况处理,稳定性保证
- 容易读容易维护
编程原则
简单性
- 消除复杂性,简单清晰逻辑编写代码
- 不理解的代码无法修复 可读性
- 阅读者是人类而非机器
- 编写可维护的代码第一步是确保代码可读 生产力 团队整体工作效率很重要
1.2 编码规范
- 代码格式 推荐使用gofmt自动格式化代码
Go语言官方提供的工具,常见IDE都支持的方便配置
goimports
实际等于gofmt加上依赖包管理,自动增删依赖的包引用,按字母序排序分类
- 注释
- 注释需要解释代码的作用
- 注释解释代码如何做的
- 注释解释代码实现的原因
- 注释解释代码什么条件下会出错
- 命名规范
- 简洁胜于冗长
- 缩略词全部大写,当其位于变量开头不需要导出时,全小写
- 变量距离使用较远,要携带更多的上下文信息。
- 控制流程
- 尽量保持代码路径为最小缩进 小结
- 显性原理,处理逻辑尽量走直线,避免嵌套逻辑
- 正常流程代码沿着屏幕向下
- 提升代码可维护性和可读性
- 故障问题大多出现在逻辑复杂和循环语句中
1.3 性能优化建议
- 前提是满足正确可靠、简洁清晰的质量因素
- 性能优化是综合评估,很有可能出现时间与空间不可兼得的情况 Benchmark
- 性能表现需要实际数据衡量
- Go语言支持基准的Benchmark测试
slice
- slice预分配内存
- 尽可能使用make()初始化切片时提供容量信息
Map
- 不断向其中添加元素会触发扩容
- 提前分配好空间可以减少内存拷贝和Rehash消耗
- 根据实际需求提前预估好需要的空间
字符串处理
- strings.Builder 性能最差 “+”
- bytes.Buffer
空结构体
atomic包
- 锁的实现是通过操作系统实现的,属于系统调用
- atomic实现通过硬件实现,效率大于锁
- sync.Matrix应该用来保护一段逻辑,不仅仅用于保护一个变量
- 对于非数值操作,可以使用atomic.Value,可以承载interface{}