样式规范
Go 编码规范
格式
使用 gofmt
命令对源文件格式化。gofmt
格式化细节如下。
- 缩进 使用 tab 缩进。gofmt 命令默认使用它。除非有特殊需求,否则不要使用 space 缩进代码。
- 行的长度 Go 对行的长度没有限制。可以换行,并插入适当的 tab 缩进。
- 括号 比起 C 和 Java,Go 所需要的括号更好:控制结构(if、for 和 switch)在语法上并不需要括号。
注释
imports 应该按照字母顺序排序,并且按照,标准库,三方,二方,一方的顺序分节。特殊情况下,如有引用顺序的需求,通过空行实现。
文档注释
出现在顶级声明之前,并且也该声明之间没有空行的注释,即文档注释。 每个包都应该包含包注释。对于包含多个文件的包,包注释只需出现在其中任一文件中。 如果文档较为复杂,使用块注释。如果较为简单,则使用行注释。
/*
balabala
ge get -u github.com/foo/bar
sample code
func main() {
fmt.Println("hello world")
}
Head
content http://www.google.com
*/
package somepkg
文档注释生成 html 的规则非常简单:
- 所有非空行,解释为段落
- 带缩进的内容,将装入
标签,一般用于样例代码
- url 自动解释为标签
- 首字母大写并且不是以“
.
”结尾的的非空行,如果紧跟一个段落,将解释为
每个非 internal 的包都需要文档注释,每个导出函数、类型、变量、方法都应该有文档注释。
命名
正如命名在其它语言中的地位,它在 Go 中同样重要。有时它们甚至会影响语义:例如,某个名称在包外是否可见,就取决于其首个字符是否为大写字母。因此有必要花点时间来讨论 协程序中的命名约定。
包名
当一个包被引入之后,包中的导出内容,都将通过包名访问。因此包应当有个恰当的名称。包名应该简洁明了而且易于理解。按照惯例,包应当以小写的单个单词来命名,且不应使用下划线或驼峰记法。
在导入包时,可以通过添加别名的方式,避免包名冲突。请勿使用import .
记法,它可以简化必须在被测试包外运行的测试,除此之外应尽量避免使用。
Getters
Go 并不对获取器(getter)和设置器(setter)提供自动支持。你应当自己提供获取器和设置器,通常很值得这样做,但若要将 Get 放到获取器的名字中,既不符合习惯,也没有必要。若你有个名为 owner(小写,未导出)的字段。其获取器应当名为 Owner(大写,可导出)而非 GetOwner。大写字母即为可导出的这种规定为区分方法和字段提供了便利。若要提供设置器方法,SetOwner 是个不错的选择。两个命名看起来都很合理:
owner := obj.Owner()
if owner != user {
obj.SetOwner(user)
}
接口名
按照约定,只包含一个方法的接口应当以该方法的名称加上 -er
后缀来命名,如 Reader、Writer、Formatter、CloseNotifier 等。
诸如此类的命名有很多,遵循它们及其代表的函数名会让事情变得简单。Read、Write、Close、Flush、String 等都具有典型的签名和意义。为避免冲突,请不要用这些名称为你的方法命名,除非你明确知道它们的签名和意义相同。反之,若你的类型实现了的方法,与一个众所周知的类型的方法拥有相同的含义,那就使用相同的命名。请将字符串转换方法命名为 String
而非 ToString
。
驼峰记法
Go 中约定使用驼峰记法 MixedCaps
或mixedCaps
而非下划线的方式来对多单词名称进行命名。
大写开头表示导出内容(public),小写开头表示非导出内容(private)。