这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
1. 高质量编程
1.1 简介
编程原则
简单性 可读性 生产力
编程规范
代码格式 注释 命名规范 控制流程 错误和异常处理
- 注释应该做的:
- 注释应该解释代码的作用
- 注释应该解释代码是如何做的
- 注释应该解释代码实现的原因
- 注释应该解释代码什么情况会出错
- 控制流程:
- 线性原理,处理逻辑尽量走直线,避免复杂的嵌套分支
- 正常流程代码沿着屏幕向下移动
- 提升代码可维护性和可读性
- 故障问题大多出现在复杂的条件语句和循环语句中
- 错误和异常处理
- 简单的错误是仅出现一次的错误,且在其他地方不需要捕获该错误
- 首先使用errors.New来创建匿名变量来直接表示简单错误
2. 性能调优
2.1 简介
- 性能优化的前提是满足正确可靠,简洁清晰等质量因素
- 性能优化是综合评估,有时候时间效率和空间效率可能对立
- 针对Go语言特性,介绍Go相关的性能优化建议
2.2 性能优化建议Benchmark
Benchmark
- 性能表现需要实际数据衡量
- Go语言提供了支持基准性能测试的benchmark
Slide
slide预分配内存
- 尽可能使用make()初始化切片时提供容量信息
另一个陷阱:大内存未释放
- 在已有切片的基础上创建切片,不会创建新的底层数组 可使用copy代替re-slice
Map
- 不断向map中添加元素的操作会触发map的扩容
- 提前分配好空间可以减少内存拷贝和Rehash的消耗
- 建议根据实际需求提前预估好需要的时间
字符串处理
使用string.Builder
- 使用+拼接性能最差,string.Builder,byte.Buffer相近,string.Buffer更快
空结构体
- 空结构体是struct{}实例不占据任何的内存空间
- 可作为各种场景下的占位符使用,节省资源
atomic包
- 锁的实现是通过操作系统来实现,属于系统调用
- atomic操作是通过硬件实现,效率比锁高
- sync.Mutex应该用来保护一段逻辑,不仅仅用于保护一个变量
- 对于非数值操作,可以使用atomic.Value,能承载一个interface{}