概述
我们将用几节来学习Go语言基础,本文结构如下:
格式化
注释
命名
包名
获取器
接口名
驼峰记法
分号
格式化
格式化问题总是充满了争议,但却始终没有形成统一的定论。在Go中我们另辟蹊径,让机器来处理大部分的格式化问题。
gofmt 程序(也可用 go fmt,它以包为处理对象而非源文件)将Go程序按照标准风格缩进、 对齐,保留注释并在需要时重新格式化。
举例来说,你无需花时间将结构体中的字段注释对齐,gofmt 将为你代劳。 假如有以下声明:
type T struct {
name string // 对象名
value int // 对象值
}
gofmt 执行后,会将它按列对齐为:
type T struct {
name string // 对象名
value int // 对象值
}
缩进
我们使用制表符(tab)缩进,gofmt 默认也使用它。在你认为确实有必要时再使用空格。
行的长度
Go对行的长度没有限制,也可进行折行并插入适当的tab缩进。
括号
Go所需的括号更少:控制结构(if、for 和 switch)在语法上并不需要圆括号。
注释
godoc 程序,既是一个程序,又是一个Web服务器,它对Go的源码进行处理,并提取包中的文档内容。
每个包都应包含一段包注释,即放置在包子句前的一个块注释。像下面这样
/*
这里是包的注释
*/
package yourpackage
在程序中,每个可导出(首字母大写)的名称都应该有文档注释。
文档注释最好是完整的句子,这样它才能适应各种自动化的展示。 第一句应当以被声明的东西开头,并且是单句的摘要。
// Compile 用于解析正则表达式并返回.....
func Compile(str string) (regexp *Regexp, err error) {
命名
请选择有语义的名字
包名
按照惯例, 包应当以小写的单个单词来命名,且不应使用下划线或驼峰记法。err 的命名就是出于简短考虑的,因为任何使用该包的人都会键入该名称。 不必担心引用次序的冲突。
另一个约定就是包名应为其源码目录的基本名称。在 src/pkg/encoding/base64 中的包应作为 "encoding/base64" 导入,其包名应为 base64, 而非 encoding_base64 或 encodingBase64。
清楚而简洁的名称。
- 例如,bufio 包中的缓存读取器类型叫做 Reader 而非 BufReader,因为用户将它看做 bufio.Reader,这是个清楚而简洁的名称。
- 用于创建 ring.Ring 的新实例的函数一般会称之为 NewRing,但由于 Ring 是该包所导出的唯一类型,简单就是 ring.New。
- 另一个简短的例子是 once.Do,once.Do(setup) 表述足够清晰, 使用 once.DoOrWaitUntilDone(setup) 完全就是画蛇添足。
- 长命名并不会使其更具可读性。一份有用的说明文档通常比额外的长名更有价值。
获取器 (get, set )的名字
Go并不对获取器(getter)和设置器(setter)提供自动支持。 你应当自己提供获取器和设置器。若你有个名为 owner (小写)字段,其获取器应当名为 Owner(大写)而非 GetOwner。设置器 SetOwner 是个不错的选择。
owner := obj.Owner()
if owner != user {
obj.SetOwner(user)
}
接口名
按照约定,只包含一个方法的接口应当以该方法的名称加上-er后缀或类似的修饰来构造一个施动着名词,如 Reader、Writer、 Formatter、CloseNotifier 等。
请将字符串转换方法命名为 String 而非 ToString。
驼峰记法
Go中约定使用驼峰记法 MixedCaps 或 mixedCaps。
分号
Go的正式语法使用分号来结束语句;但是这些分号并不在源码中出现。 词法分析器会使用一条简单的规则来自动插入分号,因此因此源码中基本就不用写分号了。
警告:if、for、switch 或 select 的左大括号放在同一行,而不是放在下一行。如果这样做,就会在大括号前面插入一个分号,你应该这样写
if i < f() {
g()
}
而不是这样
if i < f() // 错!
{ // 错!
g()
}
END
网友评论