Golang命名规范

2018-01-23
3分钟阅读时长

文件名

  1. 没有明确的规定
  2. 根据test文件的命名规范推测, 还是使用下划线比较统一.
  3. 测试文件: path_test.go
  4. 版本区分: trap_windows_1.4.go
  5. 平台区分: file_windows.go
  6. CPU区分: vdso_linux_amd64.go

由于没有明确的文档说这个事情. 从源码来看, 我觉得<a href="https://studygolang.com/articles/8542">这篇文档归档的挺不错. 以后发现有别的规定再补充.

包名

尽量短, 尽量简洁, 容易记(short, concise, evocative). 因为别人会用你的package.

包名都是小写(lower case)

一个单词(single-word), 不能是下划线或者驼峰式(mixedCaps)的命名方式. 看源码发现有人是把两个单词合成一个在用, 如: screen shot会写成screenshot

在工程中包名并不一定需要唯一. 因为包名只是默认导入的名字. 当报名冲突的时候, 可以在引入的地方重新起一个别名

包名只是目录的base name. 例如: src/encoding/base64的引入方式是import encoding/base64,但包名为base64

由于我们使用包内的元素会带上这个包名, 因此对struct, function等命名的时候, 我们可以使用非常简洁的方式. 例如: bufiobuffered reader type 命名为Reader, 而不是BufReader; 还比如, 在ring包内, 有一个类Ring, 我们为这个Ring声明一个构造函数时, 可以直接把这个函数起名为New, 而不是NewRing

函数名/变量名

函数名遵循Golang包导出的原则, 首字符大写的是包外可见的; 否则包外不可见.

命名要遵循MixedCapsmixedCaps的方式. 不能使用下划线的方式.

函数命名要避免使用一些特殊的名字, 如: Read, Write, Close, Flush, String等一些有特殊意义的名字. 防止和库函数混淆.

同样, 变量名也一样.

Getters

Go不会自动提供getterssetters, 这两个方法通常需要自己提供.

通常不建议将Get放在方法名中. 如: 在获取字段owner的时候, 尽量使用Owner(), 而不是GetOwner()

Set方法的函数名是需要带上Set的. 如: SetOwner()

owner := obj.Owner()
if owner != user {
    obj.SetOwner(user)
}

接口

如果接口只有一个方法, 那个这个接口的命名就是这个方法的名字 + 后缀(er)构成.

MixedCaps

Golang 是推荐使用MixedCaps或者mixedCaps. 强烈不建议使用下划线方式.

Receiver Name

Receiver NameReceiver Type的一个反映, 通常是这个类型的一个或者两个字符的缩写, 如: 对于Client, c或者cl就足够了, 要足够简洁.

Receiver Name 不要使用me, this, self这些OOP语言通用的名字.

同一个Type的Name, 要保持一致. 如果有一个Receiver叫c, 那么另外一个就不要叫cl了.

参考:

  1. Effictive Go

  2. 文件名规范

  3. receiver-names