Go 命名和开发规范
命名和开发规范
部分参考至 Effective Go
文件命名
文件命名一律采用小写,不用驼峰式,尽量见名思义,看见文件名就可以知道这个文件下的大概内容。 其中测试文件以 test.go 结尾,除测试文件外,命名不出现*。
例子:
stringutil.go, stringutil_test.go
包名 package
包名用小写,使用短命名,尽量和标准库不要冲突。 包名统一使用单数形式。
包的导入者可通过包名来引用其内容,因此包中的可导出名称可以此来避免冲突。 (请勿使用 import .
记法,它可以简化必须在被测试包外运行的测试, 除此之外应尽量避免使用。)例如,bufio
包中的缓存读取器类型叫做 Reader
而非 BufReader
,因为用户将它看做 bufio.Reader
,这是个清楚而简洁的名称。
用于创建 ring.Ring 的新实例的函数(这就是 Go 中的构造函数)一般会称之为 NewRing,但由于 Ring 是该包所导出的唯一类型,且该包也叫 ring,因此它可以只叫做 New,它跟在包的后面,就像 ring.New。(不是很苟同)
变量
变量命名一般采用驼峰式,当遇到特有名词(缩写或简称,如 DNS)的时候,特有名词根据是否私有全部大写或小写。
例子:
apiClient、URLString
常量
同变量规则,力求语义表达完整清楚,不要嫌名字长。 如果模块复杂,为避免混淆,可按功能统一定义在 package 下的一个文件中。
接口
单个函数的接口名以 er 为后缀
|
|
两个函数的接口名综合两个函数名,如:
|
|
三个以上函数的接口名类似于结构体名,如:
|
|
结构体
结构体名应该是名词或名词短语,如 Account,Book,避免使用 Manager 这样的。 如果该数据结构需要序列化,如 json, 则首字母大写, 包括里面的字段。
方法
方法名应该是动词或动词短语,采用驼峰式。将功能及必要的参数体现在名字中, 不要嫌长, 如 updateById,getUserInfo.
如果是结构体方法,那么 Receiver 的名称应该缩写,一般使用一个或者两个字符作为 Receiver 的名称。如果 Receiver 是指针, 那么统一使用 p。 如:
|
|
对于 Receiver 命名应该统一, 要么都使用值, 要么都用指针。
其他
获取器
Go 并不对获取器(getter)和设置器(setter)提供自动支持。
你应当自己提供获取器和设置器,通常很值得这样做,但若要将 Get 放到获取器的名字中,既不符合习惯,也没有必要。
若你有个名为 owner (小写,未导出)的字段,其获取器应当名为 Owner(大写,可导出)而非 GetOwner。大写字母即为可导出的这种规定为区分方法和字段提供了便利。 若要提供设置器方法,SetOwner 是个不错的选择。两个命名看起来都很合理:
|
|
++
和 --
Go 没有逗号操作符,而 ++ 和 – 为语句而非表达式。 因此,若你想要在 for 中使用多个变量,应采用平行赋值的方式 (因为它会拒绝 ++ 和 –).
|
|
包注释
每个包都应该有一个包注释,位于 package 之前。如果同一个包有多个文件,只需要在一个文件中编写即可;如果你想在每个文件中的头部加上注释,需要在版权注释和 Package 前面加一个空行,否则版权注释会作为 Package 的注释。如:
|
|
每个以大写字母开头(即可以导出)的方法应该有注释,且以该函数名开头。如:
|
|
大写字母开头的方法以为着是可供调用的公共方法,如果你的方法想只在本包内掉用,请以小写字母开发。如:
|
|
注释应该用一个完整的句子,注释的第一个单词应该是要注释的指示符,以便在 godoc 中容易查找。