0%
工具
- golangci-lint: 静态代码检查工具
- gofmt: 代码格式化工具
- goimports: 引用管理工具
代码风格
换行
括号和空格
- 运算符和操作数之间要留空格
- 作为输入参数或者数组下标时,运算符和运算数之间不需要空格,紧凑展示
import
- 对引用包分组管理,分为标准包、内部包、第三方包、匿名包
- 不要使用相对路径引入包
error
- error 作为函数的值返回,必须处理,且必须是最后一个参数
- 单个参数为 error 采用局部变量
- 错误描述不需要标点结尾,且全部小写
- 采用独立的错误流进行处理
- 错误返回的判断独立处理,不与其他变量组合逻辑判断
- 对于不需要格式化的错误,生成方式为:errors.New(“xxxx”)
- 格式化错误,error 生成方式为:fmt.Errorf(“module xxx: %w”, err)
panic
- 在业务逻辑处理中禁止使用 panic
- 在 main 包中使用 log.Fatal 来记录错误
- panic 捕获只能到 goroutine 最顶层,每个自行启动的 goroutine,必须在入口处捕获 panic,并打印详细堆栈信息或进行其它处理
recover
- 必须在 defer 中使用,一般用来捕获程序运行期间发生异常抛出的 panic 或程序主动抛出的 panic
assertion
- type assertion 的单个返回值形式针对不正确的类型将产生 panic。因此,请始终使用 “comma ok” 的惯用法
注释
- 包注释
// Package 包名 包信息描述
- 方法注释
// 函数名 函数信息描述
- 结构体注释
// 结构体名 结构体信息描述
- 变量和常量注释
// 变量名 变量信息描述
- 类型注释
// 类型名 类型信息描述
命名规范
- 不要使用无意义或意义太宽泛的命名
- 包命名: 保持 package 的名字和目录一致, 包名应该为小写单词,不要使用下划线或者混合大小写,使用多级目录来划分层级
- 文件命名: 文件名应该采用小写,并且使用下划线分割各个单词
- 结构体: 采用驼峰命名方式, 结构体名应该是名词或名词短语, 结构体的声明和初始化格式采用多行
- 接口命名: 采用驼峰命名方式, 单个函数的接口名以 er 作为后缀, 两个函数的接口名综合两个函数名
- 变量命名: 必须遵循驼峰式, 专有名词保持原样
- 常量命名: 必须遵循驼峰式, 专有名词保持原样
- 函数命名: 必须遵循驼峰式, 专有名词保持原样
控制结构
- if 建立局部变量
- if 变量在左,常量在右
- if bool 直接判断,不需要等号
- for 建立局部变量
- range 如果只需要第一项(key),就丢弃第二个
- range 如果只需要第二项,则把第一项置为下划线
- switch 要求必须有 default
- return 尽早 return,一旦有错误发生,马上返回
- goto 业务代码禁止使用 goto
函数
参数
- 参数数量均不能超过 5 个
- 尽量用值传递,非指针传递
- 传入参数是 map,slice,chan,interface 不要传递指针
defer
- 当存在资源管理时,应紧跟 defer 函数进行资源的释放
- 判断是否有错误发生之后,再 defer 释放资源
- 禁止在循环中使用 defer
方法的接收器
代码行数
- 文件长度不能超过 800 行
- 函数长度不能超过 80 行
嵌套
变量声明
魔法数字
- 如果魔法数字出现超过 2 次,则禁止使用,用一个常量代替
参考
- CodeReviewComments
- Effective Go
- CodeReviewComments
- CommonMistakes
- The Go Blog
- Uber Go Style Guide