【问题标题】:oneof CustomType protobuf一个 CustomType protobuf
【发布时间】:2021-11-05 03:33:24
【问题描述】:

我很想将 python 模式代码复制到 golang(protobuf)。我被困在其中一种情况。

message Type1 {
 enum Type{
 type1 = 1
}
Type type = 0;
string name = 1;
}

message Type2 {
 enum Type{
 type2 = 1
}
Type type = 0;
string name = 1;
repeated string value = 2;
}

message Type3 {
 enum Type{
 time = 1
}
Type type = 0;
string name = 1;
string format = 2;
string value = 3;
}

message Request {
something 
something
map<string, oneof_above_defined_types> params = n
}

如何确保地图只接受上面定义的自定义类型?

【问题讨论】:

    标签: go protocol-buffers proto


    【解决方案1】:

    我认为您需要定义一个包含 oneof 类型的新类型:

    message TypeX {
       oneof type_oneof {
        Type1 type_1 = 1;
        Type2 type_2 = 2;
        Type3 type_3 = 3;
      };
    }
    message Request {
       ...
       map<string, TypeX> params = n;
    }
    

    【讨论】:

    • 是的,我尝试过这样做,但看起来模式发生了变化,并且与以前的不兼容。例如。 { "id":"some_id", "random":"some_random", "params":{ "random_name":{ "type":"type1", "name":"name" }, "random_2":{ "类型":"type2", "name":"type2_name", "value":"type2_value", } }
    • 我不明白你的评论。使用我的回答中定义的 Request,您的 JSON 将是 {"params":{"key-1":{"type_1":{"type":0,"name":"name-1"}},"key-2":{"type_2":{"type":0,"name":"name-2","value":["foo","bar","baz"]}},"key-3":{"type_3":{"type":0,"name":"name-3","format":"format-3","value":"value-3"}}}}
    • 注意 Protobuf 要求枚举也从 0 开始,因为如果未设置,这些将采用默认值,这将是零;所以你需要有一个等价物。
    猜你喜欢
    • 2021-12-19
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    相关资源
    最近更新 更多