# iota
iota是常量生成器,它用于生成一组以相似规则初始化的常量,但是不用每行都写一遍初始化表达式。在一个 const 声明语句中,在第一个声明的常量所在的行,iota默认会被置为0,然后在每一个有常量声明的行自动加一。
大部分场景下,会用 iota 来生成枚举。
package main
import "fmt"
func main() {
const (
con1 = iota // 默认从0开始
con2 // 1
con3 // 2
)
fmt.Println(con1)
fmt.Println(con2)
fmt.Println(con3)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
代码输出:
0
1
2
1
2
3
2
3
但必须用定义多个常量的方式,不然会重新从0开始
package main
import "fmt"
func main() {
const con1 = iota
const con2 = iota
const con3 = iota
fmt.Println(con1)
fmt.Println(con2)
fmt.Println(con3)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
代码输出:
0
0
0
1
2
3
2
3
# 定义枚举类型
Go 语言中其实是没有枚举类型的,但是,可以使用 iota 来模拟枚举。
下面是一个定义男女性别的例子:
package main
import "fmt"
// 定义一个名为 Sex 类型, 实际类型为 int
type Sex int
// 定义性别男女
const (
woman Sex = iota // 将枚举值 Woman 定义为 Sex 类型,并搭配 iota 开始生成枚举值
man
)
func main() {
//输出枚举值
fmt.Println(woman, man)
// 使用枚举类型并赋值为man
var sex Sex = man
fmt.Println(sex)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
代码输出:
0 1
1
1
2
2
const 声明内的每一行常量声明,将会自动套用前面 iota 格式,并自动增加。有点类似于 Excel 表格自动填充功能。
也就是说,第一行 Woman 枚举值定义了 0, 那么 Man 的值会自动加一,值变成了1。
iota 除了每次自增 1 以外,我们还可以利用 iota 来完成一些更复杂的操作。比如运算符操作:
package main
import "fmt"
func main() {
const (
num1 = iota * 3 // 乘法操作,乘3
num2
num3
num4
)
fmt.Println(num1, num2, num3, num4)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
代码输出:
0 3 6 6
1
# 枚举值装换字符串
在实际应用场景中,通常需要获取枚举值对应的字符串描述,那么可以定义一个String()的 方法,一旦某个类型需要输出字符串时,Go语言会自动寻找 String() 方法并调用:
package main
import "fmt"
// 定义一个名为 Sex 类型, 实际类型为 int
type Sex int
// 定义性别男女
const (
woman Sex = iota // 将枚举值 Woman 定义为 Sex 类型,并搭配 iota 开始生成枚举值
man
)
// 定义一个 Sex 类型的方法 String(), 返回字符串
func (s Sex) String() string {
switch s {
case man:
return "男"
case woman:
return "女"
}
return "未知"
}
func main() {
var sex Sex = 3
fmt.Printf("%s,%d\n", woman, woman)
fmt.Printf("%s,%d\n", man, man)
fmt.Printf("%s,%d\n", sex, sex)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
代码输出:
女,0
男,1
未知,3
1
2
3
2
3
