【问题标题】:Create an enum from a group of related constants in Go从 Go 中的一组相关常量创建一个枚举
【发布时间】:2019-02-20 04:00:48
【问题描述】:

在 Go 语言中对大量相关常量进行分组的首选(或正确)方法是什么?例如 C# 和 C++ 都有 enum

【问题讨论】:

    标签: enums go


    【解决方案1】:

    const?

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

    【讨论】:

    • 这样的块可以有名字吗?
    • @Darius: 否 :-( 无论如何这不是分组。
    • 如果你给所有的常量赋予相同的用户定义类型,你就可以给一个块命名。有点像 lnmx 在 MyFlag 示例中尝试做的事情。
    【解决方案2】:

    有两个选项,具体取决于常量的使用方式。

    首先是基于int创建一个新类型,并使用这个新类型声明你的常量,例如:

    type MyFlag int
    
    const (
        Foo MyFlag = 1
        Bar
    )
    

    FooBar 将具有类型 MyFlag。如果你想从 MyFlag 中提取 int 值,你需要一个类型强制:

    var i int = int( Bar )
    

    如果不方便,请使用 newacct 建议的裸 const 块:

    const (
        Foo = 1
        Bar = 2
    )
    

    FooBar 是完美的常量,可以赋值给 int、float 等。

    这在常量部分的Effective Go 中有介绍。另请参阅iota 关键字的讨论,用于自动分配值,例如 C/C++。

    【讨论】:

    • 这不太正确。在您的第一个示例中, Bar 是未键入的。如果作业的右侧为空白,它只会选择 Foo 的类型。在这种情况下使用 iota 是对的。
    • @Evan 已更正,谢谢。我在发布答案之前测试了我的示例,但不知何故,额外的作业突然出现了。
    • 我不确定您是否有意,但现在它们具有相同的值和类型。
    • “如果作业的右侧为空白,它只会选择 Foo 的类型。” — 刚刚被那个陷阱咬住了。在这里强调,以便其他人注意。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      const (
          c0 = 123
          c1 = 67.23
          c2 = "string"
      )
      

      这只是为程序员添加了漂亮的可视块(编辑器允许折叠它),但对编译器没有任何作用(您不能为块指定名称)。

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

      例如:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-01
        • 2020-07-23
        相关资源
        最近更新 更多