



Go在给标识符命名时还有着考虑上下文环境的惯例,即在不影响可读性的前提下,兼顾一致性原则,尽可能地用短小的名字命名标识符。这与其他一些主流语言在命名上的建议有所不同,比如Java建议遵循“见名知义”的命名原则。我们可以对比一下Java和Go在循环变量命名上的差异,见表7-1。
表7-1 Java与Go的变量命名对比
我们在Go代码中来分别运用这两个命名方案并做比对:
for index := 0; index < len(s); index++ {
value := s[index]
...
}
// vs
for i := 0; i < len(s); i++ {
v := s[i]
...
}
我们看到,至少在for循环这个上下文中,index、value携带的信息并不比i、v多。
这里引用一下2014年Andrew Gerrard在一次关于Go命名演讲
中用的代码,我们再来感受一下Go命名惯例带来的效果:
// 不好的命名
func RuneCount(buffer []byte) int {
runeCount := 0
for index := 0; index < len(buffer); {
if buffer[index] < RuneSelf {
index++
} else {
_, size := DecodeRune(buffer[index:])
index += size
}
runeCount++
}
return runeCount
}
// 好的命名
func RuneCount(b []byte) int {
count := 0
for i := 0; i < len(b); {
if b[i] < RuneSelf {
i++
} else {
_, n := DecodeRune(b[i:])
i += n
}
count++
}
return count
}
Go语言命名惯例深受C语言的影响,这与Go语言之父有着深厚的C语言背景不无关系。Go语言追求简单一致且利用上下文辅助名字信息传达的命名惯例,如果你刚从其他语言转向Go,这可能会让你感到不适应,但这就是Go语言文化的一部分,也许等你编写的Go代码达到一定的量,你就能理解这种命名惯例的好处了。