Go基础-数据类型

2022/12/6 go

# 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

代码输出:

0
1
2
1
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

代码输出:

0
0
0
1
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

代码输出:

0 1
1
1
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

代码输出:

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

代码输出:

,0,1
未知,3
1
2
3

image-20221206133212638