Go 语言中代替枚举的办法
枚举类型用于声明一组命名的常量,当一个变量有几种可能的取值时,可以将它定义为枚举类型。在 Go 语言中,并没有提供枚举类型,但是枚举类型又是开发过程中非常重要的数据类型。因为它可以事先定义一组有效的值,可以有效地防止用户提交无效数据,抽象到业务场景中就是我们平时网页上遇到的下拉框,或者我们选择快递地址时的省市信息,均为枚举类型的用武之地。所以在 Go 语言中对常量进行了一定的扩展,使其可以完美地替代枚举类型。
1.常量中的iota
为了使常量可以更好地替代枚举类型,Go 语言提供了一个iota
关键字。使用iota
初始化常量,可以生成一组规则类似的常量,但是不用每个常量都写一遍表达式。在一个const()
表达式中,从iota
开始的常量会被置为0,向后每个常量的值为前一个常量的值加一。
代码示例:
package main
import (
"fmt"
)
type Weekday int //自定义一个星期类型,作为枚举类型
const (
Sun Weekday = iota
Mon
Tues
Wed
Thur
Fri
Sat
)
func main() {
fmt.Println("Sun :", Sun)
fmt.Println("Mon :", Mon)
fmt.Println("Tues:", Tues)
fmt.Println("Wed :", Wed)
fmt.Println("Thur:", Thur)
fmt.Println("Fri :", Fri)
fmt.Println("Sat :", Sat)
}
Tips:自定义数据类型会在Go语言拓展已有类型中详细介绍。这里可以简单地理解为定义了一个Weekday的枚举。
执行结果:
2. 将枚举值转换为字符串
使用iota
是可以使用 Go 语言的常量代替枚举类型,但是由于输出值均为阿拉伯数字,给调试和辨识造成了一定的困难。为了解决这一问题,Go 语言还提供了使常量枚举值输出为字符串的办法。需要我们手动构造一个使用枚举类型输出字符串的方法。
Tips:用的比较少,稍作了解即可
代码示例:
package main
import (
"fmt"
)
type Weekday int //自定义一个星期类型,作为枚举类型
const (
Sun Weekday = iota
Mon
Tues
Wed
Thur
Fri
Sat
)
func (w Weekday) String() string {
switch w {
case Sun:
return "Sun"
case Mon:
return "Mon"
case Tues:
return "Tues"
case Wed:
return "Wed"
case Thur:
return "Thur"
case Fri:
return "Fri"
case Sat:
return "Sat"
}
//不存在的枚举类型就返回"N/A"
return "N/A"
}
func main() {
fmt.Println("Sun :", Sun)
fmt.Println("Mon :", Mon)
fmt.Println("Tues:", Tues)
fmt.Println("Wed :", Wed)
fmt.Println("Thur:", Thur)
fmt.Println("Fri :", Fri)
fmt.Println("Sat :", Sat)
}
执行结果:
3. 小结
本文主要介绍了如何使用 Go 语言中的常量来代替枚举类型。主要有两个要点:
- 自定义枚举类型,第一个常量使用
iota
来赋值。 - 手动构建
String()
方法,使常量输出为字符串。