写点什么

枚举在 Golang 中的实现

用户头像
baiyutang
关注
发布于: 1 小时前
枚举在 Golang 中的实现

译者:baiyutang

原文:https://levelup.gitconnected.com/implementing-enums-in-golang-9537c433d6e2


注意:如果你想走得更远,我期望你对 Go 的语法和基本类型能有初级的理解,以便理解源码。


在本篇中,我将向你展示在 Golang 中如何用 iota 标志来实现枚举。在进行枚举之前,我们先理解什么是 itota 和怎么用 iota。

iota 是什么?

iota 是用于 constant 的标志。iota 关键字表示从 0 开始的 integer 常量。


iota 关键字表示连续的 integer 常量:0、1、2。当源码中出现关键字 const 就会重置为 0 ,在每一个 const 规格之后递增。

package main
import "fmt"
const ( c0 = iota c1 = iota c2 = iota)func main() { fmt.Println(c0, c1, c2) //Print : 0 1 2
复制代码


可以避免在每个常量的前面写连续的 iota。这可以如下所示简化代码:

package main
import "fmt"
const ( c0 = iota c1 c2)
func main() { fmt.Println(c0, c1, c2) //Print : 0 1 2}
复制代码


想让常量从 1 开始来代替 0 ,你可以用 iota 的算数表达式。

package main
import "fmt"
const ( c0 = iota + 1 c1 c2)
func main() { fmt.Println(c0, c1, c2) // Print : 1 2 3}
复制代码

iota 实现枚举

为了实现自定义的枚举类型,我们必须考虑如下:

  1. 声明一个新的 integer 自定义类型。

  2. iota 声明相关常量。

  3. 创建公共行为,生成 String 类型的函数。

  4. 创建附加行为,生成 EnumIndex 类型的函数。


例 1 :给星期创建枚举


package main
import "fmt"
// Weekday - Custom type to hold value for weekday ranging from 1-7type Weekday int
// Declare related constants for each weekday starting with index 1const ( Sunday Weekday = iota + 1 // EnumIndex = 1 Monday // EnumIndex = 2 Tuesday // EnumIndex = 3 Wednesday // EnumIndex = 4 Thursday // EnumIndex = 5 Friday // EnumIndex = 6 Saturday // EnumIndex = 7)
// String - Creating common behavior - give the type a String functionfunc (w Weekday) String() string { return [...]string{"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}[w-1]}
// EnumIndex - Creating common behavior - give the type a EnumIndex functionfunc (w Weekday) EnumIndex() int { return int(w)}
func main() { var weekday = Sunday fmt.Println(weekday) // Print : Sunday fmt.Println(weekday.String()) // Print : Sunday fmt.Println(weekday.EnumIndex()) // Print : 1}
复制代码


例 2:给方向创建枚举


package main
import "fmt"
// Direction - Custom type to hold value for week day ranging from 1-4type Direction int
// Declare related constants for each direction starting with index 1const ( North Direction = iota + 1 // EnumIndex = 1 East // EnumIndex = 2 South // EnumIndex = 3 West // EnumIndex = 4)
// String - Creating common behavior - give the type a String functionfunc (d Direction) String() string { return [...]string{"North", "East", "South", "West"}[d-1]}
// EnumIndex - Creating common behavior - give the type a EnumIndex functiofunc (d Direction) EnumIndex() int { return int(d)}
func main() { var d Direction = West fmt.Println(d) // Print : West fmt.Println(d.String()) // Print : West fmt.Println(d.EnumIndex()) // Print : 4}
复制代码

总结

常量是一种被称为恒定值集合的数据类型。枚举是广泛使用的一种强大的特性。但是在 Golang 中,我们的实现和其他的编程语言有很大的不同。Golang 不直接的支持枚举,我们可以用 iotaconstants 实现。


发布于: 1 小时前阅读数: 9
用户头像

baiyutang

关注

广州 2017.12.13 加入

Microservices | Golang | Cloud Nitive | “Smart work,Not hard”

评论

发布
暂无评论
枚举在 Golang 中的实现