
上QQ阅读APP看书,第一时间看更新
2.3 const关键字
当学习新的编程语言时,我们都会和自己熟悉的特性做比较。比如,如何声明变量是不可变的?在Go语言中,我们使用关键字const
,初探会发现它的使用方法几乎与其他语言一样。请在The Go Playground(https://oreil.ly/FdG-W)中查看示例2-3。
示例2-3:声明常量

运行以上代码,会看到下面的编译错误:

从上面的代码可以看出,常量就像使用var
关键字一样,可以在包级声明,也可以在函数中声明,还可以在一组小括号内声明多个常量。
同时,const
关键字也有一些规则约束。首先需要理解常量只是一个字面量命名(正如我们通过变量名使用变量一样)。编译的时候常量就已经被赋值了,这意味着可以使用以下方式给常量赋值:
- 数字字面量
true
和false
- 字符串
- 字符
- 内置函数
complex
、real
、img
、len
和cap
- 包含预声明(内置)的值和运算符的表达式
关于
len
和cap
函数的使用我们会在下一章学习。iota
是Go中预声明(内置)的一个特殊的常量[1]。关于iota
的深入学习详见第7章。
Go没有提供一种方法来指定在运行时计算的值是不可变的。在第3章,我们会看到Go中没有不可变的数组、切片、映射和结构体,也不能声明结构体中的某个字段是不可变的。在5.5节中,我们将会看到Go语言中,为了避免参数传递给函数的变量被修改,进行调用的时候都是以值传递的方式。
Go中只有常量具有不可变性,变量是不能不可变的。
[1]iota
被预声明为0,但是它的值在编译阶段并非恒定的。