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()方法,使常量输出为字符串。