我是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
字段?
答案 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)