本文最初发表在我的个人博客,查看原文,获得更好的阅读体验
和其他语言一样,在Go中,命名非常重要,甚至还有语义效果:一个名称在包外是否可见,取决于它的首字母是否大写。在导入一个包后,你只能引用其中已导出的名字。任何“未导出”的名字在该包外均无法访问。
包名可以作为包内容的访问器。包名应该尽量简单,好记。按照约定,所有包名使用小写字母,且使用单个单词表示,不需要使用下划线或大小写混合的方式(驼峰命名)。另外,包名只是默认导入的名称,不需要在所有的源代码中唯一,少数情况下,如果有必要,还可以在本地对包重命名使用。
按照Go的约定,我们一般习惯将包名与导入路径的最后一个元素保持一致。
在Go语言中,有用的文档注释通常比超长的名称更有价值。
声明包时,包名不能是空白标识符。
语法: import ["." | PackageName] ImportPath
PackageName 包名(可选) ImportPath 导入路径(必须)
如果省略包名,则默认为导入包的package子句中指定的标识符(导入路径的最后一个元素)。如果出现显式句点(.)而不是包名,则在该包的包块中声明的所有可导出标识符将在导入源文件的文件块中声明,并且必须去掉限定符访问。
导入路径只能是常规字符,且不包含这些字符: !"#$%&’()*,:;<=>?[\]^`{|}和Unicode替换符U+FFFD。
示例:
import "lib/math" math.Sin // 省略包名,默认为math import m "lib/math" m.Sin // math重命名为m import . "lib/math" Sin // 点号,忽略限定名,直接使用包不能直接或间接导入自身,也不能在导入包后不使用其中任何一个已导出标识符(换句话说,导入的包就要使用,否则不要导入),要为包的副作用(初始化)而导入包,需要使用空白标识符作为显示包名。
import _ "lib/math"Go没有为getters和setters提供自动支持。我们应该自己提供getters和setters,而且很值得这样做。但是将Get放入getter的名字既不是惯例做法,也不是必要的。例如有一个字段owner(小写,未导出),对应的getter方法应该是Owner,而不是GetOwner。使用大写名称进行导出能很好的将字段与方法区分开。如果有必要的话,setter函数可能会被称为SetOwner,在实践中两个名字可读性都很好:
owner := obj.Owner() if owner != user { obj.SetOwner(user) }按照约定,只含有一个方法的接口由方法名称加上-er后缀或类似修改来命名,以构造代理名词,例如Reader, Writer, Formatter, CloseNotifier等等。Read,Write,Close,Flush,String等具有典型的签名和含义。为避免混淆,请不要将您的方法命名为这些名称,除非它具有相同的签名和含义;反过来,如果你自定义的类型实现的方法与众所周知的类型的方法具有相同的含义,那么就应该使用相同的名称和签名;例如将你的字符串转换的方法命名为String,而不是ToString。
按照约定,Go使用驼峰法的命名,如MixedCaps或mixedCaps,而不是下划线来书写多词名称。
参考: https://golang.org/doc/effective_go.html#names https://golang.org/ref/spec#Packages