Go 基础数据类型 常量生成器 iota

常量表达式的值在编译期计算,而不是在运行期。每种常量的潜在类型都是基础类型:boolean、string或数字。

一个常量的声明语句定义了常量的名字,和变量的声明语法类似, 常量的值不可修改,这样可以防止在运行期被意外或恶意的修改。 例如,常量比变量更适合用于表达像π之类的数学常数,因为它们的值不会发生变化:
const pi = 3.14159 // approximately; math.Pi is a better approximation

和变量声明一样,可以批量声明多个常量;这比较适合声明一组相关的常量:

const ( 
e = 2.71828182845904523536028747135266249775724709369995957496696763 
pi = 3.14159265358979323846264338327950288419716939937510582097494459 
)

所有常量的运算都可以在编译期完成,这样可以减少运行时的工作,也方便其他编译优化。当操作数是常量时,一些运行时的错误也可以在编译时被发现,例如整数除零、字符串索引越界、任何导致无效浮点数的操作等。

常量间的所有算术运算、逻辑运算和比较运算的结果也是常量,对常量的类型转换操作或以下函数调用都是返回常量结果:len、cap、real、imag、complex和unsafe.Sizeof。
 
因为它们的值是在编译期就确定的,因此常量可以是构成类型的一部分,例如用于指定数组类型的长度:

iota 常量生成器


常量声明可以使用iota常量生成器初始化,它用于生成一组以相似规则初始化的常量,但是不用每行都写一遍初始化表达式。在一个const声明语句中,在第一个声明的常量所在的行,iota将会被置为0,然后在每一个有常量声明的行加一。

下面是来自time包的例子,它首先定义了一个Weekday命名类型,然后为一周的每天定义了一个常量,从周日0开始。在其它编程语言中,这种类型一般被称为枚举类型。
type Weekday int 
const ( 
   Sunday Weekday = iota 
   Monday 
   Tuesday 
   Wednesday 
   Thursday 
   Friday 
   Saturday 
)

周一将对应0,周一为1,如此等等。

我们也可以在复杂的常量表达式中使用iota,下面是来自net包的例子,用于给一个无符号整数的最低5bit的每个bit指定一个名字:
type Flags uint

	const (
		FlagUp Flags = 1 << iota // is up
		FlagBroadcast // supports broadcast access capability
		FlagLoopback // is a loopback interface
		FlagPointToPoint // belongs to a point-to-point link
		FlagMulticast // supports multicast access capability
	)
	fmt.Println(FlagUp,FlagBroadcast,FlagLoopback,FlagPointToPoint,FlagMulticast)


1 2 4 8 16

随着iota的递增,每个常量对应表达式1 << iota,是连续的2的幂,分别对应一个bit位置。使用这些常量可以用于测试、设置或清除对应的bit位的值:

下面是一个更复杂的例子,每个常量都是1024的幂:

不过iota常量生成规则也有其局限性。例如,它并不能用于产生1000的幂(KB、MB等),因为Go语言并没有计算幂的运算符。

猜你喜欢

转载自blog.csdn.net/qq_34556414/article/details/121763696