常量
定义
简而言之永远不变的值,比如:我们数学的圆周率π,常量可以是数值类型(包括整型,浮点型,和复数类型)布尔类型,字符串类型。
字面常量
字面常量(literal),是指程序中硬编码的值,或者配置文件固定的值:
-12
3.14159265358979323846 //浮点类型的常量
3.12+12i //复数类型的常量
true //不二类型的常量
”H“ //字符串常量
在其他语言中,常量通常有特定的类型,Go语言的字面常量更接近我们自然语中的常量概念,它是无型的,只要这个值在相应的类型的值域范围内,就可以作为该类型的常量,比如值12,它可以赋值为int uint int64 等类型。
常量定义
通过const关键字,你可以给字面常量指定一个友好的名字:
const Pi float64=3.1415926
const zero=0.0 //无类型浮点常量
const(
size int64=1024
eof=-1 //无类型整型常量
)
Go的常量定义可以限定常量类型,但不是必须的,如果定义常量没有指定类型,那就是无常量的类型,常量的值也可以是一个运算出固定值的表达式比如:
const a=2<<3 //这是我qq的验证码?自从设置这个验证码小姐姐再也没加上我过!
但是既然是常量,右边的运算结果必须是个固定的值,不能是一个需要在编译期执行完才知道的结果,且不固定,比如:
const Home = a.GetEnv("HOME") //非法
上述表达式会编译出错,原因很简单,a.GetEnv("HOME")只有在运行期才能知道返回结果,在编译期并不能确定,所以无法作为常量定义的右值。
预定义常量
Go语言预定义了这些常量,true,false和iota iota比较特殊,值会根据出现的次数累加,在每一个const出现的时候被重置为0,然后在下一次const出现之前,其代表的数字会自动增加1。
const (// iota被重设为0
c0 = iota // c0 == 0
c1 = iota // c1 == 1
c2 = iota // c2 == 2
)
const (
a = 1 << iota // a == 1 (iota在每个const开头被重设为0)
b = 1 << iota // b == 2
c = 1 << iota // c == 4
)
如果一个const里面的赋值语句一样,那么可以省略后一个赋值表达式,意思是和前面赋值语句一样,因此上面的例子可以改写为:
const ( // iota被重设为0
c0 = iota // c0 == 0
c1 // c1 == 1 相当于 c1 = iota
c2 // c2 == 2 相当于 c2 = iota
)
const (
a = 1 <<iota // a == 1 (iota在每个const开头被重设为0)
b // b == 2 相当于 b = 1<<iota
c // c == 4 相当于 c = 1<<iota
)
枚举
枚举是具有相同特征的一系列值,比如关于一星期的定义,我们可以通过const和iota定义,可以用const后面跟圆括号的形式定义,Go语言并不支持众多其他语言明确支持的enum关键字。
const (
Sunday = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
numberOfDays // 这个常量没有导出 因为首字母没有大写
)
同Go语言的其他符号(symbol)一样,以大写字母开头的常量在包外可见。就是包外可以访问到其值, 以上例子中numberOfDays为包内私有,其他符号则可被其他包访问。
备注
本文正在参与「掘金Golang主题学习月」, 点击查看活动详情。