样式规范

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 的规则非常简单:

  1. 所有非空行,解释为段落
  2. 带缩进的内容,将装入
    标签,一般用于样例代码
  3. url 自动解释为标签
  4. 首字母大写并且不是以“.”结尾的的非空行,如果紧跟一个段落,将解释为

每个非 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 中约定使用驼峰记法 MixedCapsmixedCaps 而非下划线的方式来对多单词名称进行命名。

大写开头表示导出内容(public),小写开头表示非导出内容(private)。

上一页