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

发布于 2024-11-28 08:28:12 字数 79 浏览 1 评论 0原文

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

What is preferred (or right) way to group large number of related constants in the Go language? For example C# and C++ both have enum for this.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

酒绊 2024-12-05 08:28:12

常量

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

const?

const (
    pi = 3.14
    foo = 42
    bar = "hello"
)
爱的十字路口 2024-12-05 08:28:12

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

第一个是基于 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
)

Foo 和 < code>Bar 是可以分配给 int、float 等的完美常量。

对此进行了介绍有效的进入常量部分。另请参阅有关 C/C++ 等自动赋值的 iota 关键字的讨论。

There are two options, depending on how the constants will be used.

The first is to create a new type based on int, and declare your constants using this new type, e.g.:

type MyFlag int

const (
    Foo MyFlag = 1
    Bar
)

Foo and Bar will have type MyFlag. If you want to extract the int value back from a MyFlag, you need a type coersion:

var i int = int( Bar )

If this is inconvenient, use newacct's suggestion of a bare const block:

const (
    Foo = 1
    Bar = 2
)

Foo and Bar are perfect constants that can be assigned to int, float, etc.

This is covered in Effective Go in the Constants section. See also the discussion of the iota keyword for auto-assignment of values like C/C++.

快乐很简单 2024-12-05 08:28:12

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

type PoiType string

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

My closest approach to enums is to declare constants as a type. At least you have some type-safety which is the major perk of an enum type.

type PoiType string

const (
    Camping            PoiType = "Camping"
    Eatery             PoiType = "Eatery"
    Viewpoint          PoiType = "Viewpoint"
)
暖风昔人 2024-12-05 08:28:12

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

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

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

唯一依赖于这个块的是 Go 中的 iota 常量声明(这对于枚举)。它允许您轻松创建自动增量(不仅仅是自动增量:更多信息请参见链接)。

例如:

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

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

It depends on what do you want to achieve by this grouping. Go allows grouping with the following braces syntax:

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

Which just adds nice visual block for a programmer (editors allow to fold it), but does nothing for a compiler (you can not specify a name for a block).

The only thing that depends on this block is the iota constant declaration in Go (which is pretty handy for enums). It allows you to create auto increments easily (way more than just auto increments: more on this in the link).

For example this:

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

will create constants c0 = 3 (3 + 5 * 0), c1 = 8 (3 + 5 * 1) and c2 = 13 (3 + 5 * 2).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文