I am a Go language developer. Our team chose to use protocol buffers to transform data.
I chose this protobuf package: https://github.com/golang/protobuf.
However, this package has no method to handle the extensions field in a protocol buffer. I have only found this code in the class file generated by 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)
}
So, how can I set/get the extensions field in Go?
解决方案
Getting the extension...
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,
)
...
Setting the extension...
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
}
EDIT
Actually, if I am reading it right, your extension is just a single field (an int32) so I don't know that you actually have a Height type. If not, it might be more like
height := proto.Int32(120)
And then you set the same way with height as a single field rather than as a distinct proto type.
This line
ExtensionType: (*int32)(nil),
Makes me think it will be a single field, whereas our extensions look more like
ExtensionType: (*SomeOtherType)(nil),
This is a good resource
TestExtensionsRoundTrip