Effective Go - The Go Programming Language (google.cn)
和其他语言一样,Go语言中命名规范也是十分重要的。它甚至会影响语义;例如某个名称(字段、方法)在包外是否可见,取决于第一个字母是否大小写。因此我们有必要花一点时间来讨论Go语言中的命名约定。
包名
当我们引入一个包后,这个包名就会成为内容的访问器。
引入bytes包后,我们就可以引用bytes.Buffer{}
。包应该有一个恰当的名称,其名称应该简短、简明、易于理解。按照惯例,包名应该小写的单个单词来命名,且不应该使用下划线或驼峰记法。Err
的命名就是处于简短考虑。包名就是导入时所需的唯一默认名称, 它并不需要在所有源码中保持唯一,即便在少数发生冲突的情况下, 也可为导入的包选择一个别名来局部使用。 无论如何,通过文件名来判定使用的包,都是不会产生混淆的。
package names
import (
"bytes"
bytes2 "bytes"
"fmt"
)
func newBuffer() {
buffer := bytes.Buffer{}
buffer2 := bytes2.Buffer{}
buffer.Write([]byte("123"))
fmt.Println(buffer)
fmt.Println(buffer2)
}
func Demo() {
compare := bytes.Compare([]byte("123"), []byte("123"))
fmt.Println(compare)
}
复制代码
另一个约定,包名应为其源码目录的基本名称。例如src/encoding/base64
中导入包名为encoding/base64
,其包名为base64
。
import "encoding/base64"
func encoding() {
base64.NewEncoding("")
}
复制代码
包的导入者可通过包名来引用其内容,因此包中的可导出名称可以此来避免冲突。(请勿使用import .
,它可以简化必须在被测试包外运行的测试, 除此之外应尽量避免使用。)
另一个简短的例子是once.Do
,once.Do(setup)
表述足够清晰, 使用 once.DoOrWaitUntilDone(setup)
完全就是画蛇添足。 长命名并不会使其更具可读性。一份有用的说明文档通常比额外的长名更有价值。
Getters
Go不提供getter和setter。你应该自己提供getter和setter方法。若你命名owner
小写字段,不支持外部访问。命名为Owner
可支持外部访问。首字母的大小写规定取分方法和字段是否可支持外部访问提供了便利。
inteface names 接口命名
按照管理,只包含一个方法的接口应当在该方法名称上加-er后缀。如Reder
、Writer
、Formatter
、CloseNotifier
MixedCaps
Go中约定是驼峰命名法MixedCaps
或mixedCaps
而不是下划线来分割多个单词命名。
近期评论