这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记
注释
-
应该解释代码作用
- 适合注释公共符号
- 适合注释实现过程
- 适合解释代码的外部因素
- 提供额外上下文
-
应该解释代码什么情况会出错
- 适合注释代码的限制条件
-
公共符号始终要注释
- 包中声明的每个公共的符号:变量、常量、函数以及结构都需要添加注释
- 任何既不明显也不简短的公共功能必须予以注释
- 无论长度或复杂程度如何,对库中的任何函数都必须进行注释
编码规范-
控制流程
- 避免嵌套
- 尽量保持正常代码路径为最小缩进
错误和异常处理
-
简单错误
- errors.New()
- 格式有要求使用 fmt.Errorf()
-
错误的Wrap和Unwrap
- 错误的Wrap实际上是提供了一个error 嵌套另一个error的能力,从而生成了一个error的跟踪链
- 在fmt.Errorf中使用:%w 关键字来将一个错误关联至错误链中
-
错误判定
- 判定一个错误是否为特定错误,使用errors.ls
- 不同于使用== 使用该方法可以判定错误链上的所有错误是否含有特定的错误
- 在错误链上获取特定种类的错误,使用errors.As
-
panic
- 不建议在业务代码中使用panic
- 调用函数不包含recover会造成程序崩溃
-
recover
- recover只能在被defer的函数中使用
- 嵌套失效
- 只在当前goroutine
- defer 的语句是后进先出
性能优化建议
-
Benchmark
- go test -bench=. -benchmen
-
slice预分配内存 尽可能提供容量
-
Map 预分配
-
字符串处理
-
使用空结构体节省内存
- 使用strings.Builder 来实现字符串拼接
-
atomic包