常量
大约 5 分钟
常量
常量的值无法在运行时改变,一旦赋值过后就无法修改,其值只能来源于:
- 字面量
- 其他常量标识符
- 常量表达式
- 结果是常量的类型转换
- iota
- 还有一些并不适合基础教程,前往参考手册-常量了解更多细节
除此之外,常量不能是其他类型,例如切片这类派生类型。
初始化
常量的声明需要用到const
关键字,常量在声明时就必须初始化一个值,并且常量的类型可以省略,例如
const name string = "Jack" // 字面量
const msg = "hello world" // 字面量
const num = 1 // 字面量
const numExpression = (1+2+3) / 2 % 100 + num // 常量表达式
如果仅仅只是声明而不指定值,将会无法通过编译
const name string
编译器报错
main.go:3:7: missing init expr for name
批量声明常量可以用()
括起来以提升可读性,可以存在多个()
达到分组的效果。
const (
Count = 1
Name = "Jack"
)
const (
Size = 16
Len = 25
)
iota
iota
是一个内置的常量标识符,通常用于表示一个常量声明中的无类型整数序数,一般都是在括号中使用。
const iota = 0
先看几个例子,看看规律。
const (
Num = iota // 0
Num1 // 1
Num2 // 2
Num3 // 3
Num4 // 4
)
也可以这么写
const (
Num = iota*2 // 0
Num1 // 2
Num2 // 4
Num3 // 6
Num4 // 8
)
还可以
const (
Num = iota << 2*3 + 1 // 1
Num1 // 13
Num2 // 25
Num3 = iota // 3
Num4 // 4
)
通过上面几个例子可以发现,iota
受一种序号的变化而变化,第一个常量使用iota
值的表达式,根据序号值的变化会自动的赋值给后续的常量,直到用新的iota
重置,这个序号其实就是代码的相对行号,是相对于当前分组的起始行号,看下面的例子
const (
Num = iota<<2*3 + 1 // 1 第一行
Num2 = iota<<2*3 + 1 // 13 第二行
_ // 25 第三行
Num3 //37 第四行
Num4 = iota // 4 第五行
_ // 5 第六行
Num5 // 6 第七行
)
例子中使用了匿名标识符_
占了一行的位置,可以看到iota
的值本质上就是iota
所在行相对于当前const
分组的第一行的差值。而不同的const
分组则相互不会影响。
注意
常量的值无法被修改,如果尝试对其进行修改的话将会无法通过编译。
const (
Size = 16
Len = 25
)
func main() {
Size++
}
编译报错
main.go:17:2: cannot assign to Size (untyped int constant 16)
虽然数字常量在Go语言中可以为任意精度,但是具体实现还是有以下限制:
- 表示整型常量时至少有256 bits、
- 表示浮点数和复数时,尾数部分至少256 bits,二进制指数部分至少16 bits
- 当无法表示相应的精度时,浮点数会进行相应的舍入。
- 否则编译器会报错