Golang命名规范

1,088 阅读6分钟

原则

  1. 需要注释来补充的命名就不算是好命名。

命名应该做到让人见名知意,好的命名可以让人节省关注注释的时间。

  1. 使用可搜索的名称

单字母名称和数字常量很难从一大堆文字中搜索出来。单字母名称仅适用于短方法中的本地变量,名称长短应与其作用域相对应。若变量或常量可能在代码中多处使用,则应赋其以便于搜索的名称。

  1. 做有意义的区分

要区分名称,就要以读者能鉴别不同之处的方式来区分

包的命名规范

  1. 保持包名称和目录名称一致。即package main对应main的文件夹目录
  2. 尽量采用一些简短直观的包名称「方便导入」,不与标准库产生冲突。
  3. 名称一般为全小写的单词,不使用下划线或者混合的大小写
package dao
package service

文件的命名规范

  1. 尽量采用一些简短直观的文件名称。
  2. 文件名「不是目录名」称一般为小写的单词,使用下划线分隔各个单词。
  3. 文件名以功能为指引,名字中不需再出现模块名或者组件名。
customer_dao.go

结构体的命名规范

  1. 命名简短直观。
  2. 一般采用驼峰命名法,首字母根据访问情况控制大写或小写。
  3. struct的声明和初始化采用多行书写。
type CustomerOrder struct {
    Name string
    Address string
}
order := CustomerOrder{"Tom", "北京市海淀区"}
  1. 结构名建议采用名词、动名词为好。
  2. 结构体名应该是名词或名词短语,如Custome、WikiPage、Account、AddressParser,避免使用 Manager、Processor、Data、Info、这样的类名,类名不应当是动词。

接口/函数的命名规范

  1. 命名简短直观。
  2. 和结构体类似,一般采用驼峰命名法,首字母根据访问情况控制大写或小写。
  3. 以大写字母开头的函数(公有,包外可见),应该添加注释。
  4. 声明和初始化采用多行书写。
  5. 单个接口/函数的命名一般以er结尾作为后缀,例如:Reader, Writer
type Reader interface {
    Read(p []byte) (n int, err error)
}
  1. 接口的实现则去掉“er”。除非有更合适的单词。

函数和方法名

  1. 函数名必须为大小写混排的驼峰模式
  2. 函数名必须为大小写混排的驼峰模式,名字可以长但是得把功能,必要的参数描述清楚,不允许出现下划线。
  3. 函数名力求精简准确,并采用用动词或动词短

如 postPayment、deletePage、save。并依 Javabean 标准加上 get、set、is前缀。 例如:xxx + With + 需要的参数名 + And + 需要的参数名 + ……

  1. 方法接收名必须为大小写混排,首字母小写。方法接收者命名要能够体现接收者对象。
  2. 接收者名通常1个或者2个字母就够,最长不能超过4个字母。
  3. 接收者名不要使用me,this 或者 self 这种泛指的名字。
	func (c *Controller) Run(stopCh <-chan struct{})
  1. 定义方法时,如果方法内不会直接引用接收者,则省略掉接收者名。
  2. 参数名必须为大小写混排,且首字母小写,不能有下划线。
  3. 返回值如果是命名的,则必须大小写混排,首字母小写
  4. 函数的返回值应避免使用命名的参数。

因为如果使用命名变量很容易导致临时变量覆盖而引起隐藏的bug。

变量的命名规范

  1. 命名简短直观。
  2. 和结构体、函数/接口类似,一般采用驼峰命名法,首字母根据访问情况控制大写或小写。
  3. 如果遇到特有名词(缩写或简称,如:DNS),需要遵循以下规则:
  • 若变量为私有,且特有名词为首个单词,则全部小写,如:appService。
  • 若变量为公有,则特有名词全部大写。
  • 若变量为bool类型,则名称以Has, Is, Can, Allow开头。
var isExit bool
var hasConflict bool
var canManage bool
var allowGitHook bool
  1. 变量命名基本上遵循相应的英文表达或简写,在相对简单的环境(对象数量少、针对性强)中,可以将一些名称由完整单词简写为单个字母

例如: user 可以简写为 u

userID 可以简写 uid

若变量类型为 bool 类型,则名称应以 Has, Is, Can 或 Allow 开头:

  var isExist bool
  var hasConflict bool
  var canManage bool
  var allowGitHook bool
  1. 多个变量申明放在一起,不区分全局或者局部
  2. 全局变量必须为大小写混排的驼峰模式,不允许出现下划线。
  3. 尽量避免跨package使用全局变量,尽量减少全局变量的使用。
var (
    Found bool
    count int
)

常量的命名规范

  1. 命名简短直观。
  2. 单词使用全部大写,并使用下划线分词。
  3. 若为枚举类型的常量,则需要先创建相应类型。
type Scheme string		//为枚举类型常量创建相应类型
const {
    HTTP Scheme = "http"
    HTTPS Scheme = "https"
}
  1. 常量&枚举名采用大小写混排的驼峰模式(Golang官方要求),不允许出现下划线
  2. 按照功能来区分,而不是将所有类型都分在一组,并建议将公共常量置于私有常量之前
const (
    KindPage = "page"

    // The rest are node types; home page, sections etc.
    KindHome         = "home"
    KindSection      = "section"
    KindTaxonomy     = "taxonomy"
    KindTaxonomyTerm = "taxonomyTerm"

    // Temporary state.
    kindUnknown = "unknown"

    // The following are (currently) temporary nodes,
    // i.e. nodes we create just to render in isolation.
    kindRSS       = "RSS"
    kindSitemap   = "sitemap"
    kindRobotsTXT = "robotsTXT"
    kind404       = "404"
)

错误处理的命名规范

错误处理的原则:

不能丢弃任何有返回err的调用,不使用_丢弃,必须全部处理。

接收到错误时,要么返回err,或者使用log记录下来,尽早return。

一旦有错误发生,马上返回,尽量不使用panic,除非知道错误处理时应该做什么。

如果用英文进行错误描述,必须为小写,不需要使用标点结尾,采用独立的错误流进行处理。

// 正确写法
// 若产生错误
if err != nil {
    // 进行错误处理
    return //或者continue
}
// 若没产生错误,则进入正常代码

// 错误写法
if err != nil {
    // 进行错误处理
    return //或者continue
} else {
    // 正常代码
}

单元测试的命名规范

  1. 一般情况下,测试用例函数名称以Test开头,如:TestExample
  2. 每个重要的函数都要首先编写测试用例,测试用例和正规代码一起提交,方便进行回归测试。
  3. 单元测试文件名,一般使用小写单词,用下划线连接,命名示例为:example_test.go

系统的预定义标识符

除了保留关键字之外,Golang语言系统还提供了36个预定义标识符,包括基础数据类型系统内嵌函数(不需要引入包,可以直接使用的函数)。

引用 1 2