下面一句摘自《Go语言编程》:
“go语言中,常量是无类型的。只要这个常量在相应类型的值域范围内,就可以作为该类型的常量,比如常量-12,它可以赋值给int、int32、int64、float32、float64、complex64、complex128等类型的变量。”
注:个人理解,这里的“无类型”,个人理解是不固定类型,并不是真的没有类型。
1、常量定义:const
go语言中常量定义和C++中的关键字一样,直接用const关键字定义。
不同的是,go中用const定义常量时,后面的常量类型不是必须的,个人感觉可以从2个方面理解:
(1).如本文件开头所述,go语言中常量不固定类型,编译器自己根据等号右边的值确定类型;
(2).也可以理解为const这个关键字和var类似,用关键字定义变量(常量)同时初始化的时候,可以不需要类型。
常量定义必须是在编译期能确定的值,如:
const tmpConst 1 << 3
由于1 << 3在编译期可以确定值,所以这行命令没问题,下面的命令会编译出错:
const Home = os.GetEnv(“HOME”)
这个命令要在运行GetEnv后得到值才能确定,所以这个命令编译会出错。
2、预定义常量
go语言中预定义常量有:ture, false和iota。
ture和false比较容易理解,分别为逻辑真和逻辑假。
iota这个常量比较特殊,iota每次遇到const,就会被置位成0,如果遇到的不是const,则每出现一次iota,iota的值就增加1。如:
const ( //遇到const,iota被赋值成0
c0 = iota //这时,tota == 0,所以c0 == 0,同时iota++,所以这个赋值完后iota== 1
c1 = iota //c1 == 1
c2 = iota //c2 == 2
)
如果两个const的赋值语句的表达式是一样的,那么可以省略后面一个赋值表达式,编译器会默认其和前面的表达式一样。如:
const
(
c0 = iota
c1 //等价于c1 = iota
c2 //等价于c2 = iota
)
const
(
c0= 3
c1 //等价于c1 = 3
c2 //等价于c2 = 3
)
3、枚举
go语言中并没有提供enum关键字定义枚举类型,要实现枚举的功能,可以使用上一节中的 const +iota来实现。如:
const
(
Sunday=iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
numberOfDays//这个常量没有导出
)
注:go语言中,大写字母开始的符号是“public”的,可以被包外看到,所以上面的numberOfDays只能在本包内可见。
有疑问加站长微信联系(非本文作者)