这是我参与「第三届青训营 -后端场」笔记创作活动的第2篇笔记
高质量编程与性能调优
编程原则
-
简单性
消除“多余的复杂性”,以简单清晰的逻辑编写代码
-
可读性
-
生产力
编码规范
注释:
-
注释应该解释代码作用, 适合注释公共符号
-
注释应该解释代码如何做的,适合注释实现过程
-
注释应该解释代码实现的原因,适合解释代码的外部因素,提供额外的上下文。
-
注释应该解释代码什么情况会出错,适合解释代码的限制条件。
-
公共符号始终需要注释
PS:代码是最好的注释,注释应提供代码未表达出的上下文信息。
变量命名:
- 简洁
- 缩略词全部大写,当其位于变量开头其不需要导出时,全部小写
- 变量与实际使用位置距离越远,需要携带的上下文信息越多
函数命名:
- 函数名不携带包名的上下文信息
- 简短
- 当名为foo的包某个函数返回类型Foo时,可以省略类型信息。
包名:
- 只由小写字母组成。不包含大写字母和下划线等字符
- 简短并包含一定上下文信息
- 不要与标准库同名
控制流程:
- 线性原理,避免嵌套
- 正常代码最小缩进
性能优化
Go提供benchmark工具进行基准性能测试
go test -bench=. -benchmen
性能优化建议
预分配
尽量在make阶段确定切片/对象大小
slice进行扩容时会在已有切片基础上创建切片,不会创建新的底层数组。
场景
- 原切片较大,代码在原切片基础上新建小切片
- 原底层数组在内存中有引用,得不到释放
此时可以使用copy代替re-slice
空结构体
使用空结构体节省内存
空结构体struct{}实例不占据任何的内存空间
使用场景:
- 节省资源
- 空结构体本身具备很强的语义,可以作为占位符使用
atomic
锁是通过操作系统来实现,属于系统调用
atomic操作通过硬件实现,效率更高
sync.Mutex应该用于保护一段逻辑,而不仅仅是用于保护一个变量