const+iota枚举最佳方式

Monday, August 28, 2023

Go中没有直接的枚举类型,但可以通过conts和iota来模拟枚举。

传统的枚举实现

const (
	Sunday = 0
	Monday = 1
	Tuesday = 2
	Wednesday = 3
	Thursday = 4
	Friday = 5
	Saturday = 6
)

这种方式不直观,可读性差。

使用iota实现枚举

const (
	Sunday = iota
	Monday
	Tuesday
	Wednesday
	Thursday
	Friday
	Saturday
)

iota会自动累加生成序列常量,这种方式很直观。

值iota自动填充

const (
	_ = iota
	Sunday  //1
	_
	Tuesday  //3
)

自定义iota起始值

const (
	StartAt = iota + 1  //1
	Sunday  //2
	Monday  //3
)

多个iota定义

const (
	A = iota  //0
	B         //1
	C = iota  //2
	D         //3
)
const (
	A = iota // 0
	B        // 1
)

const (
	C = iota // 0 (因为新的const块,iota重新开始计数)
	D        // 1
)

位运算模拟位掩码

const (
  Read = 1 << iota // 1
  Write            // 2
  Execute          // 4 
)

iota 初始值是 0,然后它被位移操作符 « 逐渐左移一位,即 1 « 0、1 « 1、1 « 2 等。这会使得 Read 的值为 1、Write 的值为 2,而 Execute 的值会是 4。

具体来说:

  • Read 对应的二进制是 001,左移 0 位,值为 1。
  • Write 对应的二进制是 010,左移 1 位,值为 2。
  • Execute 对应的二进制是 100,左移 2 位,值为 4。

字符串类型枚举

const (
  Unknown = "UNKNOWN"
  Male = "MALE"
  Female = "FEMALE"
)

Go中,iota 用于自动递增生成常量序列的枚举器,只能用于整数类型,如果想对字符串枚举,不能使用 iota。

Golang修炼

字符串转换

15.泛型

comments powered by Disqus