Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Enums 从Go中的一组相关常量创建枚举_Enums_Go - Fatal编程技术网

Enums 从Go中的一组相关常量创建枚举

Enums 从Go中的一组相关常量创建枚举,enums,go,Enums,Go,在Go语言中,对大量相关常量进行分组的首选(或正确)方法是什么?例如,C++和C++都有枚举> />代码。 < P>代码> const const ( pi = 3.14 foo = 42 bar = "hello" ) 根据常数的使用方式,有两个选项 第一种方法是基于int创建一个新类型,并使用此新类型声明常量,例如: type MyFlag int const ( Foo MyFlag = 1 Bar ) Foo和Bar将具有类型MyFlag

在Go语言中,对大量相关常量进行分组的首选(或正确)方法是什么?例如,C++和C++都有<代码>枚举> />代码。

< P>代码> const

const (
    pi = 3.14
    foo = 42
    bar = "hello"
)

根据常数的使用方式,有两个选项

第一种方法是基于int创建一个新类型,并使用此新类型声明常量,例如:

type MyFlag int

const (
    Foo MyFlag = 1
    Bar
)
Foo
Bar
将具有类型
MyFlag
。如果要从
MyFlag
提取int值,则需要类型协同:

var i int = int( Bar )
如果不方便,请使用newacct建议的裸常数块:

const (
    Foo = 1
    Bar = 2
)
Foo
Bar
是可以分配给int、float等的完美常量


这将在常量部分中介绍。另请参见有关自动分配值(如C/C++)的
iota
关键字的讨论。

这取决于您希望通过此分组实现什么。Go允许使用以下大括号语法进行分组:

const (
    c0 = 123
    c1 = 67.23
    c2 = "string"
)
它只为程序员添加了漂亮的可视块(编辑器允许折叠它),但对编译器没有任何作用(不能为块指定名称)

唯一依赖于这个块的是in-Go(这对于枚举来说非常方便)。它允许您轻松创建自动增量(不仅仅是自动增量:链接中的更多内容)

例如:

const (
    c0 = 3 + 5 * iota
    c1
    c2
)

将创建常量
c0=3
(3+5*0)、
c1=8
(3+5*1)和
c2=13
(3+5*2)。

我最接近枚举的方法是将常量声明为一种类型。至少您有一些类型安全性,这是枚举类型的主要优点

type PoiType string

const (
    Camping            PoiType = "Camping"
    Eatery             PoiType = "Eatery"
    Viewpoint          PoiType = "Viewpoint"
)

这样的街区有名字吗?@Darius:没有:-(无论如何,这不是分组。如果您为所有常量指定相同的用户定义类型,则可以在某种意义上为块指定名称。有点像lnmx在MyFlag示例中尝试执行的操作。这不太正确。在第一个示例中,条形图是非类型化的。只有在赋值右侧为空时,它才会选择Foo的类型。您是对的o在这种情况下使用iota。@Evan更正了,谢谢。我在发布答案之前测试了我的示例,但不知何故,额外的赋值突然出现在那里。我不确定你是否有意,但现在它们具有相同的值和类型。“只有在赋值的右侧为空时,才会选择Foo的类型。”-刚被那玩意咬了一口。强调一下,让其他人注意到。