Effective Go - Names 命名规则

2,895 阅读2分钟

Effective Go - The Go Programming Language (google.cn)

和其他语言一样,Go语言中命名规范也是十分重要的。它甚至会影响语义;例如某个名称(字段、方法)在包外是否可见,取决于第一个字母是否大小写。因此我们有必要花一点时间来讨论Go语言中的命名约定。

包名

当我们引入一个包后,这个包名就会成为内容的访问器。

image.png 引入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

image.png

import "encoding/base64"
func encoding() {
   base64.NewEncoding("")
}

包的导入者可通过包名来引用其内容,因此包中的可导出名称可以此来避免冲突。(请勿使用import .,它可以简化必须在被测试包外运行的测试, 除此之外应尽量避免使用。)

image.png

另一个简短的例子是once.Doonce.Do(setup) 表述足够清晰, 使用 once.DoOrWaitUntilDone(setup) 完全就是画蛇添足。 长命名并不会使其更具可读性。一份有用的说明文档通常比额外的长名更有价值。

Getters

Go不提供getter和setter。你应该自己提供getter和setter方法。若你命名owner小写字段,不支持外部访问。命名为Owner可支持外部访问。首字母的大小写规定取分方法和字段是否可支持外部访问提供了便利。 image.png

inteface names 接口命名

按照管理,只包含一个方法的接口应当在该方法名称上加-er后缀。如RederWriterFormatterCloseNotifier

image.png

MixedCaps

Go中约定是驼峰命名法MixedCapsmixedCaps而不是下划线来分割多个单词命名。