首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GO中自定义类型的ENUM

GO中自定义类型的ENUM
EN

Stack Overflow用户
提问于 2016-03-29 15:39:34
回答 3查看 6.9K关注 0票数 5

我试图为我定义的类型生成一个枚举。

代码语言:javascript
复制
type FeeStage int

中,我了解到我可以使用iota创建基于这种类型的枚举

代码语言:javascript
复制
const(
     Stage1 FeeStage = iota
     Stage2 
     Stage3
)

然而,操作枚举的实际值相当麻烦,而且容易出错。

代码语言:javascript
复制
const(
     Stage1 FeeStage = iota           // 0
     Stage2          = iota + 6       // 7
     Stage3          = (iota - 3) * 5 // -5
)

是否有方法自动将具有自定义值的ENUM列表转换为特定类型。这是我以前使用的,但只将常量的第一个成员转换为自定义类型。

代码语言:javascript
复制
const(
     Stage1 FeeStage = 1
     Stage2          = 2
     Stage3          = 2
)

这里是一个有类似结果的游乐场

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-29 15:48:53

除了使用iota和自动枚举,或者做最简单的事情之外,没有别的办法:

代码语言:javascript
复制
const(
     Stage1 FeeStage = 1
     Stage2 FeeStage = 2

     // or another syntax with same results
     Stage3 = FeeStage(2)
)

它比做像iota + 5这样的事情要麻烦得多,就像你说的那样,这真的很糟糕。

如果该值在程序上下文之外不重要,则通常使用iota;如果需要在协议或其他方面使用这些值,则使用显式类型。

虽然我不得不说,有时仅仅使用it或字符串就足够了,但这取决于上下文。例如,请参见标准库中的http状态代码。他们没有特殊的类型。

票数 8
EN

Stack Overflow用户

发布于 2016-03-29 15:50:40

您可能应该澄清您实际上想要对枚举常量做什么,但是看起来您正在尝试将任意值赋值到您的自定义类型。

如果要构造常量和要排序的初始化并遵循模式,那么使用iota就不需要麻烦了。有效围棋也有一个关于这个的章节。

您可以为枚举常量创建相当复杂的模式,这不必是容易出错和麻烦的。

票数 2
EN

Stack Overflow用户

发布于 2016-03-29 18:02:43

其实有个办法。但让我们先弄清楚一些事情。

常量声明中,如果存在类型,则常量将采用指定的类型:

代码语言:javascript
复制
const n int64 = 3 // n will be a typed constant, its type will be int64

如果省略类型,则常量将接受表达式的类型:

代码语言:javascript
复制
const x = int16(3) // x will be a typed constant, its type will be int16

如果表达式是非类型化常量,则声明的常量将保持非类型化常量:

代码语言:javascript
复制
const i = 1 // i will be an untyped integer constant

请注意,如果您试图打印i的类型(例如,使用fmt.Printf("%T", i),您将看到int ),这是因为当将一个常数传递给一个函数或将其赋值给一个变量时,它必须转换为一个实际的类型,并且将使用默认类型(因为fmt.Println()有参数类型的interface{}) --这是一个非类型化整数常量的int

在括号内的const声明列表中,表达式列表可以从声明中省略(第一个除外)。如果表达式丢失,将使用前面的非空表达式(文本替换)。

所以当你这么做的时候

代码语言:javascript
复制
const(
    Stage1 FeeStage = iota
    Stage2 
    Stage3
)

它的意思是:

代码语言:javascript
复制
const (
    Stage1 FeeStage = iota
    Stage2 FeeStage = iota
    Stage3 FeeStage = iota
)

得到3个新的常数:Stage1Stage2Stage3,均为FreeStage型。

你的第二个例子:

代码语言:javascript
复制
const (
    Stage1 FeeStage = iota           // 0
    Stage2          = iota + 6       // 7
    Stage3          = (iota - 3) * 5 // -5
)

由于您没有省略表达式,所以您的第一个常量Stage1将是一个类型化常量(类型为FreeStage),其余的将是非类型化常量!因此,这甚至没有资格(不符合您的要求)!

现在你要说的是:你想要这样的东西:

代码语言:javascript
复制
const(
    Stage1 FeeStage = 1
    Stage2          = 2
    Stage3          = 2
)

如上所述,如果省略了类型,Stage2Stage3将是非类型化常量。因此,必须指定类型,您可以利用以下事实:

代码语言:javascript
复制
ConstSpec      = IdentifierList [ [ Type ] "=" ExpressionList ] .

您可以指定标识符列表。

代码语言:javascript
复制
const(
    Stage1, Stage2, Stage3 FeeStage = 1, 2, 2
)

这更容易读吗?也许只有几个常量。如果有很多,使用Not_a_高尔夫球手的建议:

代码语言:javascript
复制
const(
    Stage1 FeeStage = 1
    Stage2 FeeStage = 2
    Stage3 FeeStage = 2
)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36288890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档