在来自不同服务的类似枚举之间进行转换

我正在实现一个通过 gRPC api 公开枚举的服务。此服务还调用另一个定义相同枚举的 gRPC API。

两个枚举都定义在不同的包中(自动生成的代码)。

如何在 Go 编程语言中在它们之间无缝转换?

谢谢!

回答

假设我们有以下枚举类型

  • Select
  • Choose

类型转换 - Playground

如果基础类型和值相同,则可以使用类型转换

type Select int32
type Choose int32

const SelectCat Select = 0
const ChooseCat Choose = 0

func main() {
  fmt.Println(Choose(SelectCat) == ChooseCat)
}

映射类型 -游乐场

在所有情况下,您都可以使用映射在 2 个枚举之间进行转换

type Select int32
type Choose string

const SelectCat Select = 0
const ChooseCat Choose = "cat"

var selectAToChooseOne = map[SelectA]ChooseOne{
  SelectACat: ChooseOneCat,
}

func SelectToChoose(selected Select) (Choose, bool) {
    chosen, ok := selectToChoose[selected]

    return chosen, ok
}

func ChooseToSelect(chosen Choose) (Select, bool) {
    for s, c := range selectToChoose {
        if c == chosen {
            return s, true
        }
    }

    return Select(-1), false
}

func main() {
  chosen, ok := SelectToChoose(SelectCat)
  _ = ok // do something with ok

  fmt.Println(chosen == ChooseCat)
}

在这种情况下,从Select种类到Choose种类的查找会更快。这是因为SelectToChoose直接使用底层映射来查找值。ChooseToSelect但是遍历每个键/值(选择/选择)对以找到正确的匹配项。我在ok这些方法中添加了一个,但这不是必需的


以上是在来自不同服务的类似枚举之间进行转换的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>