
2.2 常量
常量的值不可变更。原因在于它的值在编译期已经确定,不像变量那样可以在运行时进行修改。既然常量的值在编译期就确定了,那么赋值动作只能是一次性的,也就没有必要将声明和赋值动作拆开。因此,Go语言要求常量的声明和赋值同时完成。
2.2.1 常量的声明
声明一个常量,应该使用const关键字,同时为常量赋值。一个简单的常量定义的实例如下:
const a = 10
由于Go语言特有的变量/常量声明语法,我们可能会混淆其用法。一个常见的问题是,能不能用“:=”来声明常量。例如,声明常量能否写作const a : =10。图2-5展示了该声明语句在GoLand中的表现。

图2-5 使用“:=”声明常量将会出现编译错误
虽然“:=”是声明+赋值的缩略形式,但它是“变量声明+赋值”操作的结合体(即var+=),因此对于常量const无效。
2.2.2 常量块的使用
与变量块类似,多个常量同样可以提取出const关键字,例如:

一般情况下,我们会将业务意义相关的一组常量提取为一个常量块。常量块有一个很有趣的特点:如果多个连续常量使用相同的表达式赋值,那么可以只为第一个常量赋值,后续常量只定义常量名称即可。代码清单2-4演示了这种用法。
代码清单2-4 连续的相同赋值表达式的缩略写法

执行该代码,其输出如下:
10 10 10
可见,a、b、c三个常量都被赋予了相同的值,即10。
2.2.3 常量可以声明而不使用
只声明而不使用常量,不会出现编译错误,在GoLand等IDE中,只会出现优化提示,如图2-6所示。

图2-6 声明但未被使用的常量,会出现优化提示
无论是全局变量,还是常量,在“声明但未使用”这一点的处理上比较一致,都不会像局部变量那样直接出现编译错误。那么,这其中的原因是什么呢?
常量未使用是可以被编译器识别出来的,但是因为常量的值在编译期就确定了,这意味着如果未被使用,那么多余的语句最多只会有一条,副作用不会太大(局部变量可以不断进行赋值操作,可能出现很多次无用的赋值语句)。最重要的是,编译器可以识别常量的冗余,在编译时会忽略无用的常量。