7.2 利用上下文环境,让最短的名字携带足够多的信息

Go在给标识符命名时还有着考虑上下文环境的惯例,即在不影响可读性的前提下,兼顾一致性原则,尽可能地用短小的名字命名标识符。这与其他一些主流语言在命名上的建议有所不同,比如Java建议遵循“见名知义”的命名原则。我们可以对比一下Java和Go在循环变量命名上的差异,见表7-1。

表7-1 Java与Go的变量命名对比

069-1

我们在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命名演讲[1]中用的代码,我们再来感受一下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代码达到一定的量,你就能理解这种命名惯例的好处了。


[1]https://talks.golang.org/2014/names.slide#1