这是我参与「第三届青训营 -后端场」笔记创作活动的第3篇笔记
高质量编程原则:
- 简单性
- 可读性
- 生产力
1编码规范
1.1代码格式
使用gofmt官方推荐格式,在编译器中会自动调整
1.2注释
注释要解释代码作用、实现方法、为何这样实现、说明情况下会出错;提供给外部的符号始终要注释
- 代码是最好的注释
- 注释应该提供代码未表达出的上下文信息
1.3命名规范
- variable,简洁胜过冗长,会恰当使用缩略词,变量距离其被使用的地方越远,则需要携带越多的上下文信息
- function,不携带包名上下文信息,尽量简短,根据函数返回类型判断是否加入类型信息
- package,只用小写字母,大写/下划线都不包含,包含一定信息,不与标准库同名。 总结:考虑上下文,便于所有开发者理解。
1.4控制流程
- 避免嵌套,避免冗余,保持正常流程代码路径为最小缩进,其他流程优先判断并return
- 线性原理,处理逻辑尽量走直线,避免复杂嵌套分支,提高地面可读性
1.5错误和异常处理
- 优先使用errors.New创建匿名变量表示错误,有格式化需求时使用fmt.Errorf
- 错误链:fmt.Errorf中使用 %w 关键字来将一个错误 wrap 至其错误链中
- 使用errors.ls可以判断错误链上的特定错误,使用errors.As可以获取错误
- 在程序启动阶段发生不可逆错误可以使用panic,业务代码中不建议使用panic
- recovery只能在被defer的函数中使用,无法嵌套,只在当前goroutine生效;recovery后在log中可记录当前调用栈
2.性能优化建议
- 在满足正确性、可靠性、健壮性、可读性等质量因素的前提下,设法提高程序的效率
- 性能对比测试代码,可参考 github.com/RaymondCode…
2.1 slice预分配内存
尽可能在使用make()初始化切片时提供容量信息,因为扩容很耗时,且可能导致大内存得不到释放
2.2 map预分配内存
与slice有点相同,也是尽量提前预估空间、分配空间,以减少内存拷贝和Rehash消耗
2.3使用string.Builder
三种字符串拼接方式中,strings.Builder最快,+最慢
2.4使用空结构体节省内存
空结构体不占据内存空间,可作为占位符使用
2.5使用atomic包
- 使用atomic操作是通过硬件实现的,效率比锁通过操作系统实现高
- 如果保护一个变量建议使用atomic,sync.Mutex应用于保护一段逻辑
——THE END——
推荐阅读:
- Go 代码 Review 建议github.com/golang/go/w…
- Uber 的 Go 编码规范,github.com/uber-go/gui…