GoLang中常量定义和C语言中很相似:
C中,const int NYEAR=12;
GoLang中,也是用const,但这样写:
const(
Nyear=12
Nmonth=30
)
如果是数值型,并且需要递增时,C语言可以这样写:
enum week{
Mon=1,
Tues, // 2
Wed, //3
Thurs //3
}
也是自动递增。但是类型就是枚举类型了。
GoLang中自动递增的常量,写成这样:
const (
_ =iota // iota的 初始值是0 ,忽略此值,不命名。
Mon //1 ,每换行才递增
Tues //2 ,每换行才递增
Wed //3
Thurs //4
)
iota表示自动递增,每换行才执行递增计算。iota初始值是0。
如果有”_”下划线,表示跳过命名,但是iota需要递增计算。
常量定义中,默认使用上一行的表达式来计算下一行的值,上面的例子中,就相当于:
Mon 的值就是 先计算递增值为1,再赋值给Mon。如果是个表达式,看下面例子
const(
_ =iota // 忽略 0
a =iota+1 // a=1+1 =2
b // b=2+1=3
c // c =3+1=4
)
注释中明确解释了表达式的计算方式。
最后,给一个经典写法:
type ByteSize float64
const (
_ = iota // ignore first value by assigning to blank identifier
KB ByteSize = 1 << (10 * iota) // 1 << (10*1)
MB // 1 << (10*2)
GB // 1 << (10*3)
TB // 1 << (10*4)
PB // 1 << (10*5)
EB // 1 << (10*6)
ZB // 1 << (10*7)
YB // 1 << (10*8)
)
常量还可以定义类型:
type Uu8 Uint8
const(
a Uu8=iota
b
c
)
如果一个函数的入参是Uint8,则是不能使用a作为入参的。例如:
func thisfun(Uint x){}
thisfun(a){} //编译错误
编译器检查发现类型错误,如果强制类型转换则可以。
thisfun(Uint8(a)){}