如何从其字符串表示中获取 Protobuf 枚举值?
How to get a Protobuf enum value from its string representation?
我可以通过这条指令获取 Protobuf 枚举的字符串值:
str := testPB.Status_ENABLED.String()
如何进行逆运算? (从字符串中获取枚举元素)。
生成的代码有一个名为 <EnumName>_value
的映射,类型为 map[string]int32
。然后可以将数值转换为实际定义的类型:
num := testPB.Status_value[str]
v := testPB.Status(num)
请考虑如果地图中不存在 str
值(请注意它区分大小写),则地图查找将 return 0
。根据您定义 protobuffer 的方式,0
值可能会映射到一个不具有“零”语义的枚举实例。这就是为什么建议将 0
映射到“未知”实例的原因:
enum Status {
UNKNOWN = 0;
ENABLED = 1;
// and so on
}
如果字符串表示实际上是未知的,在 Go 中哪个正确地产生临时零值:
v := testPB.Status(testPB.Status_value["does_not_exist"])
fmt.Println(v == testPB.Status_UNKNOWN) // true
我可以通过这条指令获取 Protobuf 枚举的字符串值:
str := testPB.Status_ENABLED.String()
如何进行逆运算? (从字符串中获取枚举元素)。
生成的代码有一个名为 <EnumName>_value
的映射,类型为 map[string]int32
。然后可以将数值转换为实际定义的类型:
num := testPB.Status_value[str]
v := testPB.Status(num)
请考虑如果地图中不存在 str
值(请注意它区分大小写),则地图查找将 return 0
。根据您定义 protobuffer 的方式,0
值可能会映射到一个不具有“零”语义的枚举实例。这就是为什么建议将 0
映射到“未知”实例的原因:
enum Status {
UNKNOWN = 0;
ENABLED = 1;
// and so on
}
如果字符串表示实际上是未知的,在 Go 中哪个正确地产生临时零值:
v := testPB.Status(testPB.Status_value["does_not_exist"])
fmt.Println(v == testPB.Status_UNKNOWN) // true