
2.6 常量与变量的命名
Go中的命名规范和实际开发中的常量与变量的命名模式往往有些不同[1]。与大部分编程语言一样,Go语言要求标识符名称以字母或者下划线开头,名称中可以包含任意数字、下划线或者字母,而且在Go语言中,字母和数字有更广泛的定义,任何Unicode字符的字母或者字符都是允许的。在示例2-4中,变量定义方式完全符合Go语言规范。
示例2-4:不合法的变量名

尽管以上代码可以正常工作,但是不要使用这样的变量名,因为这些名称并非Go语言惯例,而且违背了代码表达意图的基本规则。这样命令不仅让人费解,而且在一些键盘上难以输入这些符号,有一些Unicode字符看起来很像,甚至显示一样的字符,但却表示不同的变量[2]。运行示例2-5。
示例2-5:看似一样的变量名

运行以上代码会得到如下结果:

虽然下划线在变量名里是合法字符,但是尽量不要使用它。因为在Go语言中当变量名包含多个单词时,约定使用驼峰命名法(比如indexCounter
或者numberTries
),而不是蛇形命名法(比如index_counter
或者number_tries
)。
在第5章讨论函数的时候,我们将再次讨论Go中使用下划线的特殊变量名。
在众多高级编程语言中,常量一直使用大写字母,单词间使用下划线分隔(比如INDEX_COUNTER
或NUMBER_TRIES
)。但是Go没有遵守这个模式,因为Go使用包级别声明名称中首字母的大小来确定这个变量外部访问的可见性[3],我们将在第9章深入讨论这些内容。
在函数内部,建议使用简短的变量名。变量的范围越小,使用的名称越短。所以在Go中单字母变量名十分常见。例如,变量名k
和v
(key和value的缩写)在for-range
循环中经常使用。当使用标准for
循环时,i
和j
则是索引变量的常用名。在第11章中我们将会介绍更多命名的最佳实践。
一些弱类型编程语言鼓励开发者在变量名中包含类型名称。虽然Go是强类型的,不需要使用这样的方式知道其底层类型,但是在变量名和单字母名时建议使用首字母作为变量名(例如,i
代表整数,f
代表浮点数,b
代表布尔值),自定义类型时这个约定同样适用。
这样的简写有两个目的。首先,它们消除了重复的输入,使代码更短。其次,简写可以验证代码的简洁程度,当简写的变量名堆积如山,使代码难以理解,就说明代码需要整理和重构了。
在包代码块中命名变量和常量时,为了名称具有更强的描述性和可读性,可自行取舍变量名是否包含类型名[4]。
[1]编程语言有常量和变量的命名规范,在不违反命名规范的基础上,面向工程领域的开发者往往会总结出一系列命名模式。
[2]比如拉丁字母a,可以查看这个字符的详细说明(https://www.fuhaozi.com/unicode/f/ff41.html),它看起来似乎和英文的a一样,但在Unicode中拉丁字母a的byte值是65345,而英文字母a的byte值是97。
[3]Go语言外部访问可见性采用:首字母大写为PUBLIC则包外部可访问,首字母小写为private则仅能包内访问。
[4]命名是一项面向工程的实践,在不违反语言规范和基本约定的情况下,为了增加代码的可读性,可以探索和实践一些更有描述性的命名方式。