常量概念
常量是指编译期间就已知的且不可改变的值。
从功能角度看,当出现不需要被更改的数据时,应该使用常量进行存储,比如圆周率
常量使用一个名称来绑定一块内存地址,该内存地址中存放的数据类型有定义常量时指定的类型来决定,并且存放在该内存地址里面的存放的值是不可以被改变的。
常量的值仅仅支持,基础类型,字符串,字符,整型,浮点,布尔。
字面常量(字面量)
字面常量通常指在程序中硬编码的常量。为基本数据类型赋值的结果值被称之为字面常量,例如,const a = 10;这个10被称之为字面常量。
66 //数值常量
3.1415926 //浮点类型的常量
3.12+12i //复数类型的常量
true //布尔类型的常量
"for" //字符串类型的常量
字面常量在Go语言程序中是无类型的,只要这个常量值在相应类型的值域范围内,就可以作为该类型常量值。比如66 就可以赋值给 :int 、uint、int32、int64、float32、float64、complex64、complex128等类型的常量名。
常量的定义
使用const关键字可以给字面常量定义一个名称。
const 常量名 <可选的类型> = 常量值
const Pi float64 = 3.1415926
const zero = 0.0 //无类型浮点数
const (
size int64 = 1024
eof = -1 //无类型整型常量
)
const u, v float32=0, 3 //u= 0.0 v= 3.0 常量的多重赋值
const a, b, c = 3, 4, "fot" //a = 3, b = 4, c = "fot" //无类型整型和字符串常量
跟变量一样,类型可以通过值推导出来,大多数情况下可以省略类型。除非想用例如int8,byte,float32这种非默认类型时,定义常量的时候需要指定类型:
const c2 = 1000
const c3 int16 = 1000
常量的赋值是一个编译期行为,所以常量值不允许出现任何需要在运行期间才能得出结果的表达式。
const v1 = 1 << 3 //支持
const v2 = os.GetEnv("HOME") //不支持, os.GetEnv()只有在运行期间才知道返回结果。
也不能使用变量为其赋值。可以使用,确定的字面量,字面量运算,内置函数运算,其他定义常量,这些在编译时可以确定的内容为常量赋值
const v1 = "fk"
const (
v2 = v1
v3 = 42 + 11
V4 = len("fk")
)
预定义常量
Go语言预定义的常量:true、false、iota。
iota:迭代定义常量。const配合iota关键字使用,可以定义一组由0开始+1迭代的常量。在每一个const关键字出现时iota常量值被重置为1,然后在下一个const出现之前,没出现一次iota其所代表的值就会加1。
const ( //此时iota被重置为0
v1 = iota //v1的值是0
v2 = iota //v2的值是1
v3 = iota //v3的值是2
)
const ( //此时iota被重置为0
a = 1 << iota //a的值是1
b = 1 << iota //b的值是2
c = 1 << iota //c的值是3
)
const ( //此时iota被重置为0
u = iota * 3 //u的值是0
v float64 = iota * 42 //v的值是42.0
w = iota * 42 //w的值是84
)
const (
c1 = 42 // iota = 0,虽然未使用iota,但后边(const()中)有使用,此时iota被初始化为0,下面每行累加1
c2 = iota // iota = 1,iota继续累加,使用了iota
c3 = 1024 // iota = 2,同样未使用,但iota的值继续累加。c3 被定义为1024
c4 // iota = 3,c4延续上面的定义c4=1024,iota继续累加==如果2个赋值语句的表达式是一样的可以省略后面一个赋值表达式==
c5 = iota // iota = 4,iota继续累加,使用了iota,c5 = 5
c6 = iota // iota = 5,iota继续累加,使用了iota,c6 = 6
)
const x = iota //x的值为0
const y = iota //y的值为0
枚举
枚举指一系列相关的常量。比如:
const (
Sunday = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
numberofDays //这个常量没有导出
Go语言当中以大写字母开头的常量在包外可见,可以被其他包访问。其他符号也是一样。