首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Go中具有作用域的多个const名称集

Go中具有作用域的多个const名称集
EN

Stack Overflow用户
提问于 2015-12-29 00:11:44
回答 1查看 3.4K关注 0票数 2

我有一个Go应用程序,它需要无限数量的常量集。应用程序还要求我能够在运行时将字符串映射到(整数) consts,反之亦然。常量的名称只保证是有效的标识符,因此几乎肯定会有重复的const名称。特别是,每一组常量都有一个名为“无效”的元素。在C++11中,我会使用枚举类来实现范围。在Python中,我可能会使用类变量。我很难找到一种惯用的方式来表达这一点。我看过的选项包括:

  • 为每一组consts使用一个单独的包。这有很多缺点,因为我希望整个集合都在同一个包中,这样我就可以在包级别上构建对这些集的支持,这样我就可以在不过度复杂测试代码同时进行多包测试的情况下对这些集进行测试。

first.go

代码语言:javascript
复制
package first
type First int
const (
    ConstOne First = iota
    ConstTwo
    Invalid = -1
)

func IntToCode(fi First)string { ... }
func CodeToInt(code string)First { ... }

second.go

代码语言:javascript
复制
package second
type Second int
const (
    ConstOne Second = iota
    ConstTwo
    Invalid = -1
)

func IntToCode(se Second)string { ... }
func CodeToInt(code string)Second { ... }

example.go

代码语言:javascript
复制
import (
    "first"
    "second"
)

First fi = first.CodeToInt("ConstOne")
Second se = second.Invalid
  • 对每个const使用一个全局唯一前缀的尝试和真实技术。但是,考虑到集合的数量确实很大,必须使用编码约定来从本质上发明和管理一堆名称空间,这在最好的情况下是尴尬的。这个选项也迫使我修改consts的名称(这就是使用它们的全部意义)。

first.go

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
package mypackage

import (
    "first"
    "second"
)

First fi = first.CodeToInt("ConstOne")
Second se = SE_INVALID

更好更地道的解决方案是什么?我希望能说出这样的话:

代码语言:javascript
复制
First fi = First.Invalid

但我并没有成功地想出一种允许这样做的方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-30 02:07:31

您可以为单独的代码集拥有单独的包,也可以有一个单独的包来定义与代码关联的更高级别的功能,并为该更高级别的包编写测试。

我没有编译或测试这些:

例如,用于一组代码:

代码语言:javascript
复制
package product // or whatever namespace is associated with the codeset

type Const int

const (
    ONE Const = iota
    TWO
    ...
    INVALID = -1
)

func (c Const) Code() string {
    return intToCode(int(c)) // internal implementation
}

type Code string

const (
     STR_ONE Code = "ONE"
     ...
)

func (c Code) Const() int {
    return codeToInt(string(c)) // internal implementation
}

例如,对于较高级别的函数包:

代码语言:javascript
复制
// codes.go
package codes

type Coder interface{
    Code() string
}

type Conster interface{
    Const() int
}

func DoSomething(c Coder) string {
    return "The code is: " + c.Code()
}    

// codes_product_test.go
package codes

import "product"

func TestProductCodes(t *testing.T) {
    got := DoSomething(product.ONE) // you can pass a product.Const as a Coder
    want := "The code is: ONE"
    if got != want {
        t.Error("got:", got, "want:", want)
    }
}

编辑:

要检索特定代码的const,可以执行以下操作

代码语言:javascript
复制
product.Code("STRCODE").Const()

如果Const()返回一个Coder,这样product.Code("ONE").Const()就可以成为一个product.Const,也许会更好。我认为如果你在这里玩的话,有几个选择,在那里会有一个很好的选择。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34502647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档