这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
一、高质量编程
- 编码规范
- 代码规范:使用gofmt和goimports工具进行开发
- 注释:需要尽可能地解释
- 命名规范:
- 缩略词全大写,但当其位于变量开头且不需要导出时,使用全小写
- 包名,只由小写字母组成。不包含大写字母和下划线等字符
- 错误和异常处理
- 优先使用errors.New来创建匿名变量来直接表示简单错误
- 错误的Wrap实际上是提供了一个error嵌套另一个error的能力,从而生成一个error的跟踪链。在fmt.Errorf中使用:%w关键字来将一个错误关联至错误链中
- 判定一个错误是否为特定错误,使用errors.Is。不同于使用==,使用该方法可以判定错误链上的所有错误是否含有特定的错误
- 在错误链上获取特定种类的错误,使用errors.As
- recover只能在被defer的函数中使用。嵌套无法生效。只在当前goroutine生效。defer的语句是后进先出
- 小结
- error尽可能提供简明的上下文信息链,方便定位问题
- panic用于真正异常的情况
- recover生效范围,在当前goroutine的被defer的函数中生效
- 性能优化建议
- 采用工具BenchMark
- slice预分配内存
- 尽可能在使用make()初始化切片时提供容量信息
- 如果要在已有切片基础上创建切片,使用copy替代re-slice
- map预分配内存
- 字符串处理
- 使用strings.Builder:使用+拼接性能最差,strings.Builder,bytes.Buffer相近,strings.Buffer更快
- 空结构体
- 使用空结构体节省内存。空结构体struct{}实例不占据任何的内存空间,可作为各种场景下的占位符使用
- 实现Set,可以考虑用map来代替,对于这个场景,只需要用到map的键,而不需要值。
- atomic包