Golang 代码规范

工具

  • golangci-lint: 静态代码检查工具
  • gofmt: 代码格式化工具
  • goimports: 引用管理工具

代码风格

换行

  • 一行代码不要超过 120 列

括号和空格

  • 运算符和操作数之间要留空格
  • 作为输入参数或者数组下标时,运算符和运算数之间不需要空格,紧凑展示

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 行

嵌套

  • 嵌套深度不能超过 4 层

变量声明

  • 变量声明尽量放在变量第一次使用前面,就近原则

魔法数字

  • 如果魔法数字出现超过 2 次,则禁止使用,用一个常量代替

参考

  • CodeReviewComments
  • Effective Go
  • CodeReviewComments
  • CommonMistakes
  • The Go Blog
  • Uber Go Style Guide