上QQ阅读APP看书,第一时间看更新
7.2 利用上下文环境,让最短的名字携带足够多的信息
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命名演讲[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代码达到一定的量,你就能理解这种命名惯例的好处了。