Go Enum和iota
【摘要】 Golang没有内置的enum类型,通常都是用常量来模拟。如下例所示:package enum1import ( "fmt" "testing")type Hero intconst ( IRONMAN Hero = 0 SPIDERMAN Hero = 1 BATMAN Hero = 2)func TestName(t *testing.T) { ironman := IRONM...
Golang没有内置的enum类型,通常都是用常量来模拟。如下例所示:
package enum1
import (
"fmt"
"testing"
)
type Hero int
const (
IRONMAN Hero = 0
SPIDERMAN Hero = 1
BATMAN Hero = 2
)
func TestName(t *testing.T) {
ironman := IRONMAN
fmt.Println(ironman == SPIDERMAN)
fmt.Println(ironman == IRONMAN)
}
输出为false、true。我们可以用iota这个go的语法糖来简化这个代码
import (
"fmt"
"testing"
)
type Hero int
const (
IRONMAN Hero = iota
SPIDERMAN
BATMAN
)
func TestName(t *testing.T) {
ironman := IRONMAN
fmt.Println(ironman == SPIDERMAN)
fmt.Println(ironman == IRONMAN)
}
输出结果和上面一样。下面介绍一下iota的语法
- iota的初始值为0
- 每经过一个
ConstSpec
语句,iota会递增。在同一个ConstSpec
中出现的iota的值一样。如 a, b = iota, iota,a和b的值相同。 - 每当const关键字出现,iota会重置为0
const (
// iota reset to 0
// c0 = 0
c0 = iota
// c1 = 1
c1 = iota
// c2 = 2
c2 = iota
)
const (
// iota reset to 0
// a = 1
a = 1 << iota
// b = 2
b = 1 << iota
// c = 4
c = 1 << iota
)
const (
// u = 0
u = iota * 42
// v = 42.0
v float64 = iota * 42
// w = 84
w = iota * 42
)
const x = 0
const y = 0
// 在表达式列表中,每个iota的值都相同,iota仅仅在每个ConstSpec之后递增
const (
bit0, mask0 = 1 << iota, 1<<iota - 1 // bit0 == 1, mask0 == 0
bit1, mask1 // bit1 == 2, mask1 == 1
_, _ // skips iota == 2
bit3, mask3 // bit3 == 8, mask3 == 7
)
参考资料
https://stackoverflow.com/questions/14426366/what-is-an-idiomatic-way-of-representing-enums-in-go
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)