【问题标题】:Converting between similar enums from different services在来自不同服务的相似枚举之间进行转换
【发布时间】:2021-06-25 18:21:09
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

    标签: go protocol-buffers grpc


    【解决方案1】:

    假设我们有以下枚举类型

    • Select
    • Choose

    类型转换 - Playground

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

    type Select int32
    type Choose int32
    
    const SelectCat Select = 0
    const ChooseCat Choose = 0
    
    func main() {
      fmt.Println(Choose(SelectCat) == ChooseCat)
    }
    

    映射类型 - Playground

    在所有情况下,您都可以使用映射在 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,但这不是必需的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-08
      相关资源
      最近更新 更多