如何在Go中设置/获取protobuf的扩展字段?

时间:2015-03-02 16:52:17

标签: go protocol-buffers

我是Go语言开发人员。我们的团队选择使用协议缓冲区来转换数据。 我选择了这个protobuf包:https://github.com/golang/protobuf。 但是,此程序包没有方法来处理协议缓冲区中的extensions字段。我只在protoc生成的类文件中找到了这段代码:

var E_Height = &proto.ExtensionDesc{
    ExtendedType:  (*Person)(nil),
    ExtensionType: (*int32)(nil),
    Field:         110,
    Name:          "eg.Height",
    Tag:           "varint,110,opt",
}

func init() {
    proto.RegisterExtension(E_Height)
}

那么,如何在Go中设置/获取extensions字段?

2 个答案:

答案 0 :(得分:1)

获取扩展程序......

yourExtendedEvent := &path_to_your_events.Person{}
err := proto.Unmarshal(yourBytes, yourExtendedEvent)
if err != nil {
    // handle error case
}
extendedEvent, extendedError := proto.GetExtension(
    yourExtendedEvent,
    path_to_your_events.E_Height,
)
...

设置扩展程序......

yourExtendedEvent := &path_to_your_events.Person{
    Field1: proto.Uint64(1),
    Field2: proto.String("foo"),
}

height := &path_to_your_events.Height {
    Field1: proto.Int64(120),
}

err := proto.SetExtension(
    yourExtendedEvent,
    path_to_your_events.E_Height,
    height,
)

if err != nil {
    // handle error case
}

编辑

实际上,如果我正确读取它,你的扩展名只是一个字段(int32),所以我不知道你实际上有Height类型。如果没有,它可能更像是

height := proto.Int32(120)

然后您将高度设置为单个字段,而不是作为不同的原型类型。

这一行

ExtensionType: (*int32)(nil),

让我觉得它将是一个单独的领域,而我们的扩展看起来更像是

ExtensionType: (*SomeOtherType)(nil),

这是一个很好的资源 TestExtensionsRoundTrip

答案 1 :(得分:0)

来自:https://developers.google.com/protocol-buffers/docs/reference/go-generated#extensions

<块引用>

例如,给定以下定义:

extend Foo {
  optional int32 singular_int32 = 1;
  repeated bytes repeated_string = 2;
  optional Bar repeated_message = 3;
}

可以通过以下方式访问扩展值:

m := &somepb.Foo{}
proto.SetExtension(m, extpb.E_SingularInt32, int32(1))
proto.SetExtension(m, extpb.E_RepeatedString, []string{"a", "b", "c"})
proto.SetExtension(m, extpb.E_RepeatedMessage, &extpb.Bar{})

v1 := proto.GetExtension(m, extpb.E_SingularInt32).(int32)
v2 := proto.GetExtension(m, extpb.E_RepeatedString).([][]byte)
v3 := proto.GetExtension(m, extpb.E_RepeatedMessage).(*extpb.Bar)