原则
- 需要注释来补充的命名就不算是好命名。
命名应该做到让人见名知意,好的命名可以让人节省关注注释的时间。
- 使用可搜索的名称
单字母名称和数字常量很难从一大堆文字中搜索出来。单字母名称仅适用于短方法中的本地变量,名称长短应与其作用域相对应。若变量或常量可能在代码中多处使用,则应赋其以便于搜索的名称。
- 做有意义的区分
要区分名称,就要以读者能鉴别不同之处的方式来区分
包的命名规范
- 保持包名称和目录名称一致。即
package main对应main的文件夹目录 - 尽量采用一些简短直观的包名称「方便导入」,不与标准库产生冲突。
包名称一般为全小写的单词,不使用下划线或者混合的大小写。
package dao
package service
文件的命名规范
- 尽量采用一些简短直观的文件名称。
文件名「不是目录名」称一般为小写的单词,使用下划线分隔各个单词。- 文件名以功能为指引,名字中不需再出现模块名或者组件名。
customer_dao.go
结构体的命名规范
- 命名简短直观。
- 一般采用驼峰命名法,首字母根据访问情况控制大写或小写。
struct的声明和初始化采用多行书写。
type CustomerOrder struct {
Name string
Address string
}
order := CustomerOrder{"Tom", "北京市海淀区"}
- 结构名建议采用名词、动名词为好。
- 结构体名应该是名词或名词短语,如Custome、WikiPage、Account、AddressParser,避免使用 Manager、Processor、Data、Info、这样的类名,类名不应当是动词。
接口/函数的命名规范
- 命名简短直观。
- 和结构体类似,一般采用驼峰命名法,首字母根据访问情况控制大写或小写。
- 以大写字母开头的函数(公有,包外可见),应该添加注释。
- 声明和初始化采用多行书写。
- 单个接口/函数的命名一般以
er结尾作为后缀,例如:Reader, Writer
type Reader interface {
Read(p []byte) (n int, err error)
}
- 接口的实现则去掉“er”。除非有更合适的单词。
函数和方法名
- 函数名必须为大小写混排的驼峰模式
- 函数名必须为大小写混排的驼峰模式,名字可以长但是得把功能,必要的参数描述清楚,不允许出现下划线。
- 函数名力求精简准确,并采用用动词或动词短
如 postPayment、deletePage、save。并依 Javabean 标准加上 get、set、is前缀。 例如:xxx + With + 需要的参数名 + And + 需要的参数名 + ……
- 方法接收名必须为大小写混排,首字母小写。方法接收者命名要能够体现接收者对象。
- 接收者名通常1个或者2个字母就够,最长不能超过4个字母。
- 接收者名不要使用me,this 或者 self 这种泛指的名字。
func (c *Controller) Run(stopCh <-chan struct{})
- 定义方法时,如果方法内不会直接引用接收者,则省略掉接收者名。
- 参数名必须为大小写混排,且首字母小写,不能有下划线。
- 返回值如果是命名的,则必须大小写混排,首字母小写
- 函数的返回值应避免使用命名的参数。
因为如果使用命名变量很容易导致临时变量覆盖而引起隐藏的bug。
变量的命名规范
- 命名简短直观。
- 和结构体、函数/接口类似,一般采用驼峰命名法,首字母根据访问情况控制大写或小写。
- 如果遇到特有名词(缩写或简称,如:DNS),需要遵循以下规则:
- 若变量为私有,且特有名词为首个单词,则全部小写,如:appService。
- 若变量为公有,则特有名词全部大写。
- 若变量为bool类型,则名称以Has, Is, Can, Allow开头。
var isExit bool
var hasConflict bool
var canManage bool
var allowGitHook bool
- 变量命名基本上遵循相应的英文表达或简写,在相对简单的环境(对象数量少、针对性强)中,可以将一些名称由完整单词简写为单个字母
例如: user 可以简写为 u
userID 可以简写 uid
若变量类型为 bool 类型,则名称应以 Has, Is, Can 或 Allow 开头:
var isExist bool
var hasConflict bool
var canManage bool
var allowGitHook bool
- 多个变量申明放在一起,不区分全局或者局部
- 全局变量必须为大小写混排的驼峰模式,不允许出现下划线。
- 尽量避免跨package使用全局变量,尽量减少全局变量的使用。
var (
Found bool
count int
)
常量的命名规范
- 命名简短直观。
- 单词使用全部大写,并使用下划线分词。
- 若为枚举类型的常量,则需要先创建相应类型。
type Scheme string //为枚举类型常量创建相应类型
const {
HTTP Scheme = "http"
HTTPS Scheme = "https"
}
- 常量&枚举名采用大小写混排的驼峰模式(Golang官方要求),不允许出现下划线
- 按照功能来区分,而不是将所有类型都分在一组,并建议将公共常量置于私有常量之前
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 {
// 正常代码
}
单元测试的命名规范
- 一般情况下,测试用例函数名称以
Test开头,如:TestExample。 - 每个重要的函数都要首先编写测试用例,测试用例和正规代码一起提交,方便进行回归测试。
- 单元测试文件名,一般使用小写单词,用下划线连接,命名示例为:
example_test.go。
系统的预定义标识符
除了保留关键字之外,Golang语言系统还提供了36个预定义标识符,包括基础数据类型和系统内嵌函数(不需要引入包,可以直接使用的函数)。