这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
什么是高质量编程
- 正确性:是否考虑各种边界条件,错误的调用是否能够处理
- 可靠性:异常情况或者错误的处理策略是否明确,依赖的服务出现异常是否能够处理
- 简洁:逻辑是否简单,后续调整功能或新增功能是否能够快速支持
- 清晰:其他人在阅读理解代码的时候是否能清楚明白,重构或者修改功能是否不会担心出现无法预料的问题
一、编码规范
gofmt自动格式化代码
注释的规范
- 解释代码作用
- 解释代码如何做的
- 解释代码实现的原因
- 解释代码什么情况会出错
命名规范
- 简洁胜于冗长
- 缩略词全大写,但当其位于变量开头且不需要导出时,使用全小写
- 变量距离其被使用的地方越远,则需要携带越多的上下文信息
- 函数不携带包名的上下文信息
- 包名小写,不要和标准库同名
控制流程
- 避免嵌套,保持流程清晰
- 正常的流程沿着屏幕向下移动
错误和异常处理
- 使用errors.New()或fmt.Errorf生成一个error
- 使用error.Is判断特定错误
- 使用panic和defer recover()进行异常处理
- Golang错误和异常处理的正确姿势 - 简书 (jianshu.com)
二、性能优化建议
性能优化要用数据衡量,这里使用基准测试进行性能测试
slice
- 尽量对切片预分配内存,定义容量cap,可以省去很多分配空间的消耗
- 对于在已有切片上创建切片不建议直接切,原来的切片底层数组不会被释放,建议使用copy()函数,原切片就会被回收
map
- 尽量预分配内存
string
- 主要是用string.Builder或bytes.Buffer来代替“+”
- go语言string之Buffer与Builder - 云+社区 - 腾讯云 (tencent.com)
struct{}(空结构体,不占任何空间)
- 配合map:只关心key不关心value
make(map[string]struct{})
- 配合chan,只起到通知信号的作用,一般是无缓冲的chan
make(chan struct{})