Go Enum和iota

举报
张俭 发表于 2023/12/30 11:46:21 2023/12/30
【摘要】 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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。