我有一个需要无限数量的常量集的 Go 应用程序。该应用程序还要求我能够在运行时将字符串映射到(整数)常量,反之亦然。常量的名称只能保证是有效的标识符,因此几乎可以肯定会有重复的常量名称。特别是,每组常量都有一个称为“无效”的元素。在 C++11 中,我会使用枚举类来实现作用域。在 Python 中,我可能会使用类变量。我正在努力寻找一种在 Go 中表达这一点的惯用方式。我看过的选项包括:
为每组常量使用单独的包。这有很多缺点,因为我宁愿整个集合都在同一个包中,这样我就可以在包级别构建对这些集合的支持,这样我就可以测试整个集合,而不会使测试代码过于复杂一次进行多包测试。
first.go:
package first
type First int
const (
ConstOne First = iota
ConstTwo
Invalid = -1
)
func IntToCode(fi First)string { ... }
func CodeToInt(code string)First { ... }
second.go:
package second
type Second int
const (
ConstOne Second = iota
ConstTwo
Invalid = -1
)
func IntToCode(se Second)string { ... }
func CodeToInt(code string)Second { ... }
example.go:
import (
"first"
"second"
)
First fi = first.CodeToInt("ConstOne")
Second se = second.Invalid
对每个常量使用经过验证的全局唯一前缀技术。然而,考虑到集合的数量真的很大,必须使用编码约定从本质上发明和管理一堆命名空间充其量是尴尬的。此选项还迫使我修改常量的名称(这是使用它们的全部意义)。
first.go:
package mypackage
type First int
const (
FI_CONSTONE First = iota
FI_CONSTTWO
FI_INVALID = -1
)
func IntToCode(fi First)string { ... }
func CodeToInt(code string)First { ... }
second.go:
package mypackage
type Second int
const (
SE_CONSTONE Second = iota
SE_CONSTTWO
SE_INVALID = -1
)
func IntToCode(se Second)string { ... }
func CodeToInt(code string)Second { ... }
example.go:
package mypackage
import (
"first"
"second"
)
First fi = first.CodeToInt("ConstOne")
Second se = SE_INVALID
什么是更好、更惯用的解决方案?我希望能够说这样的话:
First fi = First.Invalid
但我没有成功地提出一种允许这样做的方法。
繁星coding
相关分类