如何从其字符串表示中获取 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