这是我参与「第三届青训营 -后端场」笔记创作活动的的第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
流程
- 建立服务性能评估手段
- 分析性能数据,定位性能瓶颈
- 重点优化项改造
- 优化效果验证