如何用Proto消息的键设置另一消息属性的类型?
Protobuf中引用其他消息字段作为类型的解决方案
首先明确:Protobuf本身没有直接引用其他消息的字段名作为类型的语法,你写的[name|id]这种写法不合法,无法直接实现。
下面给你两种可行的解决方案:
使用枚举类型(推荐)
把允许用作排序的字段名定义成枚举值,既能限定有效值,又能保证编译期类型安全:enum OrderByField { ORDER_BY_FIELD_UNSPECIFIED = 0; // Protobuf枚举要求必须包含0值作为默认项 NAME = 1; ID = 2; } message MessageName { string name = 1; string id = 2; } message AnotherMessage { OrderByField order_by = 1; }这种方式语义清晰,后续如果要新增排序字段,只需在枚举里添加新值即可,维护成本低。
字符串类型加业务校验
如果一定要用字符串类型存储字段名,Protobuf本身不会帮你限定值范围,只能在业务逻辑层做校验,判断传入的字符串是否为name或id。但这种方式没有编译期校验,容易出现非法值,不推荐。
你提到的oneOf并不适合这个场景——oneOf是用来定义互斥字段(比如一个消息里只能有name_order或id_order其中一个),而非限定单个字段的有效值范围,所以没必要用这种方式重复键。
内容的提问来源于stack exchange,提问作者mgm793
相关产品推荐
相关产品推荐

