为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
当年话下 2022-09-12 16:01:15
我正在实现一个通过 gRPC API 公开枚举的服务。此服务还调用另一个定义相同枚举的 gRPC API。这两个枚举都在不同的包(自动生成的代码)中定义。如何在Go编程语言中无缝转换它们?谢谢!
查看完整描述

1 回答

?
撒科打诨

TA贡献1934条经验 获得超2个赞

假设我们有以下枚举类型

  • Select

  • Choose

类型转换 - 游乐场

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

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)

}


在这种情况下,从一种到另一种的查找将更快。这是因为直接使用基础映射来查找值。 但是,迭代每个键/值(选择/选择)对以查找正确的匹配项。我已经为这些方法添加了 一个,但这不是必需的SelectChooseSelectToChooseChooseToSelectok


查看完整回答
反对 回复 2022-09-12
  • 1 回答
  • 0 关注
  • 83 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信