【发布时间】:2019-02-20 04:00:48
【问题描述】:
在 Go 语言中对大量相关常量进行分组的首选(或正确)方法是什么?例如 C# 和 C++ 都有 enum 。
【问题讨论】:
在 Go 语言中对大量相关常量进行分组的首选(或正确)方法是什么?例如 C# 和 C++ 都有 enum 。
【问题讨论】:
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 块:
const (
Foo = 1
Bar = 2
)
Foo 和 Bar 是完美的常量,可以赋值给 int、float 等。
这在常量部分的Effective Go 中有介绍。另请参阅iota 关键字的讨论,用于自动分配值,例如 C/C++。
【讨论】:
我最接近枚举的方法是将常量声明为一种类型。至少你有一些类型安全,这是枚举类型的主要优点。
type PoiType string
const (
Camping PoiType = "Camping"
Eatery PoiType = "Eatery"
Viewpoint PoiType = "Viewpoint"
)
【讨论】:
这取决于你想通过这个分组实现什么。 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)。
【讨论】: