在来自不同服务的相似枚举之间进行转换
Converting between similar enums from different services
我正在实施一项通过 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)
}
映射类型 - 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
遍历每个 key/value (Select/Choose) 对以找到正确的匹配项。我在这些方法中添加了 ok
,但这不是必需的
我正在实施一项通过 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)
}
映射类型 - 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
遍历每个 key/value (Select/Choose) 对以找到正确的匹配项。我在这些方法中添加了 ok
,但这不是必需的