高质量编程与性能调优实战|青训营笔记

143 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第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——

推荐阅读: