从0开始go语言-4|Go主题月

316 阅读3分钟

常量

定义

简而言之永远不变的值,比如:我们数学的圆周率π,常量可以是数值类型(包括整型,浮点型,和复数类型)布尔类型,字符串类型。

字面常量

字面常量(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主题学习月」, 点击查看活动详情