Go语言中的常量使用关键字 const 定义,用于存储不会改变的数据,常量是在编译时被创建的,即使定义在函数内部也是如此,并且只能是布尔型、数字型(整数型、浮点型和复数)和字符串型。由于编译时的限制,定义常量的表达式必须为能被编译器求值的常量表达式。
常量的定义格式:
const name [type] = value
在Go语言中,可以省略类型说明符 [type],因为编译器可以根据变量的值来推断其类型。
显式类型定义: const b string = "abc"
隐式类型定义: const b = "abc"
多重赋值: const a, b, c = 1, false, "str"
const(
a = 1
b = false
c = "str"
) //两种多重赋值一样。
常量的值必须是能够在编译时就能够确定的,可以在其赋值表达式中涉及计算过程,但是所有用于计算的值必须在编译期间就能获得。
正确的做法:const c1 = 2/3
错误的做法:const c2 = getNumber() // 引发构建错误: getNumber() 用做值
所有常量的运算都可以在编译期完成,这样不仅可以减少运行时的工作,也方便其他代码的编译优化,当操作数是常量时,一些运行时的错误也可以在编译时被发现,例如整数除零、字符串索引越界、任何导致无效浮点数的操作等。
常量间的所有算术运算、逻辑运算和比较运算的结果也是常量,对常量的类型转换操作或以下函数调用都是返回常量结果:len、cap、real、imag、complex 和 unsafe.Sizeof。
常量组申请常量,当第一个赋值,后面未赋值,会自动套用前面一个的值,且第一个值必须赋值。
const (
a = "abc" //a的值为abc
b //b的值也是abc
c = 100
d //d的值为100
e //e的值为100
iota(常量生成器)
iota在const关键字出现时将被重置为0(const内部的第一行之前),const中每新增一行常量声明将使iota计数一次(iota可理解为const语句块中的行索引)。
(1)iota每当遇到const时会重置为0
const a = iota // a=0
const (
b = iota //b=0
c //c=1
)
(2) iota在const组合声明中,每新增一行iota+1
const a = iota //a = 0
const(
b = iota // b = 0
c = iota // c = 1
)
(3) 跳值使用法
想跳过某些值,可以使用来实现,相当于垃圾桶。
const(
a = iota // a = 0
b = iota // b = 1
_
c = iota // c = 3,_接收了 2,因此此时c应该为3
)
(4) 插队使用法
const(
a = iota // a = 0
b = 100 // b = 100
c = iota // c = 2
d // d = 3
)
(5) 在一个const组合声明中,如果没有指定表达式,则使用最近的非空表达式
const(
a = iota * 2 // a = 0
b = iota * 3 // b = 3
c // c = 6
d // d = 9
)
(6) 如果一行有多个定义,会一一对应
const(
a,b = iota,iota+3 // a = 0,b=3
c,d // c对应的表达式为c = iota = 1,d对应的表达式为b = iota+3 =4
e,_ // e= 2
)
(7) 跳过枚举值
左移运算符"<<“是双目运算符。左移n位就是乘以2的n次方。 其功能把”<<“左边的运算数的各二进位全部左移若干位,由”<<"右边的数指定移动的位数,高位丢弃,低位补0。
const(
a = 1 <<iota //a = 1, iota为0,1左移0位 = 1
b //b = 2,iota为1,1左移1位 = 2
c //c = 4,iota为2,1左移2位 = 4