为了账号安全,请及时绑定邮箱和手机立即绑定

GO 中自定义类型的 ENUM

GO 中自定义类型的 ENUM

Go
慕哥9229398 2021-12-27 18:05:23
我正在尝试为我定义的类型生成一个枚举type FeeStage int从这个我知道,我可以用丝毫基于这种类型来创建一个枚举const(     Stage1 FeeStage = iota     Stage2      Stage3)但是,操作枚举的实际值相当麻烦且容易出错const(     Stage1 FeeStage = iota           // 0     Stage2          = iota + 6       // 7     Stage3          = (iota - 3) * 5 // -5)有没有办法将具有自定义值的 ENUM 列表自动转换为某种类型。这是我之前使用的,但只将常量的第一个成员转换为自定义类型。const(     Stage1 FeeStage = 1     Stage2          = 2     Stage3          = 2)这是一个具有类似结果的游乐场
查看完整描述

3 回答

?
Helenr

TA贡献1780条经验 获得超4个赞

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


const(

     Stage1 FeeStage = 1

     Stage2 FeeStage = 2


     // or another syntax with same results

     Stage3 = FeeStage(2)

)

恕我直言,这比做iota + 5你所说的那样真的很糟糕。


如果值在程序上下文之外不重要,我通常要么使用 iota,要么在需要在协议或其他东西中使用这些值时使用显式类型。


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


查看完整回答
反对 回复 2021-12-27
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

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

iota如果您构建常量和要排序的初始化并遵循模式,则使用不需要很麻烦。 Effective Go也有一个关于这个的部分。

您可以为枚举常量创建相当复杂的模式,这不一定容易出错和繁琐。


查看完整回答
反对 回复 2021-12-27
?
catspeake

TA贡献1111条经验 获得超0个赞

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


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


const n int64 = 3 // n will be a typed constant, its type will be int64

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


const x = int16(3) // x will be a typed constant, its type will be int16

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


const i = 1 // i will be an untyped integer constant

请注意,如果您尝试打印i的类型(例如 with fmt.Printf("%T", i),您将看到int,那是因为在将常量传递给函数或将其分配给变量时,必须将其转换为实际类型,并且默认类型将被使用(因为fmt.Println()参数类型为interface{}) - 这是int一个无类型的整数常量。


在带括号的const声明列表中,表达式列表可以从声明中省略(除了第一个)。如果缺少表达式,则将使用之前的非空表达式(文本替换)。


所以当你这样做时:


const(

    Stage1 FeeStage = iota

    Stage2 

    Stage3

)

它的意思是:


const (

    Stage1 FeeStage = iota

    Stage2 FeeStage = iota

    Stage3 FeeStage = iota

)

这导致了 3 个新常量:Stage1,Stage2和Stage3,都属于 类型FreeStage。


你的第二个例子:


const (

    Stage1 FeeStage = iota           // 0

    Stage2          = iota + 6       // 7

    Stage3          = (iota - 3) * 5 // -5

)

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


现在说到你的观点:你想要这样的东西:


const(

    Stage1 FeeStage = 1

    Stage2          = 2

    Stage3          = 2

)

如上所述,如果你离开了型,Stage2而Stage3将非类型化常量。因此必须指定类型,您可以利用 const 规范是这样的事实:


ConstSpec      = IdentifierList [ [ Type ] "=" ExpressionList ] .

您可以指定一个标识符列表:


const(

    Stage1, Stage2, Stage3 FeeStage = 1, 2, 2

)

这是否更具可读性?也许如果只有几个常量。如果有很多,使用 Not_a_Golfer 的推荐:


const(

    Stage1 FeeStage = 1

    Stage2 FeeStage = 2

    Stage3 FeeStage = 2

)


查看完整回答
反对 回复 2021-12-27
  • 3 回答
  • 0 关注
  • 222 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信