在 Go语言中实现枚举

发布于 2021-11-04 14:19 ,所属分类:软件编程学习资料

CTO



GoRustPythonIstiocontainerdCoreDNSEnvoyetcdFluentdHarborHelmJaegerKubernetesOpenPolicyAgentPrometheusRookTiKVTUFVitessArgoBuildpacksCloudEventsCNIContourCortexCRI-OFalcoFluxgRPCKubeEdgeLinkerdNATSNotaryOpenTracingOperatorFrameworkSPIFFESPIREThanos





在 Go中实现枚举

枚举可以将相关的常量归为一种类型。枚举是一个强大的功能,用途广泛。然而,在 Go 中,它们的实现方式与大多数其他编程语言大不相同。

注意:在你继续之前,我希望你们都对 Go 语法和原始类型有一个初级的理解,以理解下面的代码。

在本文中,我将向您展示如何使用预先声明的标识在 Golang 中实现枚举iota,以及它是如何使用的。

什么是iota?

iota是一个标识符,constant它可以简化使用自动递增数字的常量定义。iota关键字代表整数从零开始.

iota 关键字表示连续的整数常量 0, 1, 2,...。只要在源代码中出现 const 一词,它就会重置为 0,并在每个 const 规范后递增。

packagemain

import"fmt"

const(
c0=iota
c1=iota
c2=iota
)
funcmain(){
fmt.Println(c0,c1,c2)//Print:012
}

您可以避免iota在每个常量前面写连续的= iota。这可以简化为以下代码清单:

packagemain

import"fmt"

const(
c0=iota
c1
c2
)

funcmain(){
fmt.Println(c0,c1,c2)//Print:012
}

要将常量列表从 1 而不是 0开始,您可以iota在算术表达式中使用。

packagemain

import"fmt"

const(
c0=iota+1
c1
c2
)

funcmain(){
fmt.Println(c0,c1,c2)//Print:123
}

您可以使用空白标识符跳过常量列表中的值。

packagemain

import"fmt"

const(
c1=iota+1
_
c3
c4
)

funcmain(){
fmt.Println(c1,c3,c4)//Print:134
}

使用 iota 实现枚举

为了实现我们必须执行的自定义枚举类型考虑以下

  • 声明一个新的自定义类型——整数类型。
  • 声明相关常量——使用iota.
  • 创建通用行为——给类型一个String函数。
  • 创建额外的行为——给类型一个EnumIndex函数。
示例 1:为工作日创建一个枚举。
packagemain

import"fmt"

//Weekday-Customtypetoholdvalueforweekdayrangingfrom1-7
typeWeekdayint

//Declarerelatedconstantsforeachweekdaystartingwithindex1
const(
SundayWeekday=iota+1//EnumIndex=1
Monday//EnumIndex=2
Tuesday//EnumIndex=3
Wednesday//EnumIndex=4
Thursday//EnumIndex=5
Friday//EnumIndex=6
Saturday//EnumIndex=7
)

//String-Creatingcommonbehavior-givethetypeaStringfunction
func(wWeekday)String()string{
return[...]string{"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}[w-1]
}

//EnumIndex-Creatingcommonbehavior-givethetypeaEnumIndexfunction
func(wWeekday)EnumIndex()int{
returnint(w)
}

funcmain(){
varweekday=Sunday
fmt.Println(weekday)//Print:Sunday
fmt.Println(weekday.String())//Print:Sunday
fmt.Println(weekday.EnumIndex())//Print:1
}

示例 2:为方向创建一个枚举。

packagemain

import"fmt"

//Direction-Customtypetoholdvalueforweekdayrangingfrom1-4
typeDirectionint

//Declarerelatedconstantsforeachdirectionstartingwithindex1
const(
NorthDirection=iota+1//EnumIndex=1
East//EnumIndex=2
South//EnumIndex=3
West//EnumIndex=4
)

//String-Creatingcommonbehavior-givethetypeaStringfunction
func(dDirection)String()string{
return[...]string{"North","East","South","West"}[d-1]
}

//EnumIndex-Creatingcommonbehavior-givethetypeaEnumIndexfunctio
func(dDirection)EnumIndex()int{
returnint(d)
}

funcmain(){
vardDirection=West
fmt.Println(d)//Print:West
fmt.Println(d.String())//Print:West
fmt.Println(d.EnumIndex())//Print:4
}

结论

枚举是由一组命名常量值组成的数据类型。枚举是一个强大的功能,用途广泛。但是,在 Golang 中,它们的实现方式与大多数其他编程语言大不相同。Golang 不直接支持枚举。我们可以使用iotaand来实现它constants。暂时就这些……继续学习……快乐学习

相关资源