高质量编程 | 青训营笔记

93 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记

编码规范

代码格式

1.gofmt

Go语言官方提供的工具,能自动格式化Go语言代码为官方统一风格常见IDE都支持方便的配置。使用GoLang的时候,当我们保存代码的时候,将会自动运行进行排版。

在之前的学习中的for 或 if 后加上括号,当保存时候将会被IDE自动去掉,就是Go fmt 的帮助。

2.goimports

也是Go语言官方提供的工具,实际等于gofmt 加上依赖包管理,自动增删依赖的包引用、将依赖包按字母序排序并分类。团队开发管理包的时候,可以考虑使用。

注释

作用:
  • 解释代码

    • 描述函数的功能和用途的同时也应当避免啰嗦
  • 对代码中复杂、不明显的逻辑进行说明

  • 解释代码外部因素,这些因素脱离上下文之后很难理解

  • 提醒使用者一些潜在的限制条件或者会无法处理的情况

总结:

代码是最好的注释,好的代码习惯与逻辑强过所有的注释

注释应当是对代码的补充,用来提供代码没有表达出的上下文信息

但是要注意,在代码的不断迭代中,可能注释来不及更新导致注释并不能很好解释代码。

命名规范

首先在Go语言中,首字母大写的函数等可以在包外被访问,首字母小写只能在包内访问。

变量
  • 变量名应当保证简洁
  • 缩略词全大写(如HTTP),但当其位于变量开头且不需要导出时,使用全小写
  • 变量距离其被使用的地方越远,则需要携带越多的上下文信息(尤其是全局变量)
函数
  • 函数名不携带包名的上下文信息,因为包名和函数名总是成对出现的
  • 函数名尽量简短
  • 当名为foo 的包某个函数返回类型Foo 时,可以省略类型信息而不导致歧义
  • 当名为foo的包某个函数返回类型T时(T并不是Foo),可以在函数名中加入类型信息

  • 只由小写字母组成,不包含大写字母和下划线等字符
  • 简短并包含一定的上下文信息。例如schema、 task 等
  • 不要与标准库同名。例如不要使用sync或者strings
  • 不使用常用变量名作为包名。例如使用bufio 而不是 buf
  • 使用单数而不是复数。例如使用encoding而不是encodings
  • 谨慎地使用缩写。例如使用fmt在不破坏上下文的情况下比 format更加简短

控制流程

  • 避免多层嵌套,保证流程清晰
  • 有多个return,要去除多余的else
  • 尽量保持正常代码路径为最小缩进

错误与异常处理

  • error要尽可能提供简明的上下文信息链,方便定位
  • panic用于真正的异常处理
  • recover生效范围在当前的goroutine的被defer的函数中生效

性能调优

原则

性能调优要考数据而不是猜测

性能调优工具

pprof

流程

  1. 建立服务性能评估手段
  2. 分析性能数据,定位性能瓶颈
  3. 重点优化项改造
  4. 优化效果验证