译者: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 实现枚举
为了实现自定义的枚举类型,我们必须考虑如下:
声明一个新的 integer
自定义类型。
用 iota
声明相关常量。
创建公共行为,生成 String
类型的函数。
创建附加行为,生成 EnumIndex
类型的函数。
例 1 :给星期创建枚举
package main
import "fmt"
// Weekday - Custom type to hold value for weekday ranging from 1-7
type Weekday int
// Declare related constants for each weekday starting with index 1
const (
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 function
func (w Weekday) String() string {
return [...]string{"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}[w-1]
}
// EnumIndex - Creating common behavior - give the type a EnumIndex function
func (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-4
type Direction int
// Declare related constants for each direction starting with index 1
const (
North Direction = iota + 1 // EnumIndex = 1
East // EnumIndex = 2
South // EnumIndex = 3
West // EnumIndex = 4
)
// String - Creating common behavior - give the type a String function
func (d Direction) String() string {
return [...]string{"North", "East", "South", "West"}[d-1]
}
// EnumIndex - Creating common behavior - give the type a EnumIndex functio
func (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
不直接的支持枚举,我们可以用 iota
和 constants
实现。
评论