如何在Go中设置/获取protobuf的扩展字段? [英] How to set/get protobuf's extension field in Go?
问题描述
我是Go语言开发人员。我们的团队选择使用协议缓冲区来转换数据。
我选择了这个protobuf包: https://github.com/golang/protobuf 。
然而,这个包没有方法来处理协议缓冲区中的扩展
字段。我只在protoc生成的类文件中找到了这段代码:
var E_Height =& proto.ExtensionDesc {
ExtendedType:(* Person)(nil),
ExtensionType:(* int32)(nil),
字段:110,
名称:eg.Height,
标签:varint,110,opt,
}
func init(){
proto.RegisterExtension(E_Height)
}
那么,如何在Go中设置/获取
扩展
字段?
解决方案获取扩展名...
$ c> yourExtendedEvent:=& path_to_your_events.Person {}
err:= proto.Unmarshal(yourBytes,yourExtendedEvent)
if err!= nil {
//处理错误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 {
//处理错误情况
}
编辑 其实 $ b
,如果我正确地阅读它,你的扩展只是一个字段(一个int32),所以我不知道你实际上有一个 Height
类型。如果不是,它可能更像是
height:= proto.Int32(120)
然后,您将高度设置为单个字段而不是明确的原始类型。
这一行
ExtensionType:(* int32)(nil) ,
让我觉得这将是一个单一的领域,而我们的扩展看起来更像是
ExtensionType:(* SomeOtherType)(nil),
这是一个很好的资源
TestExtensionsRoundTrip
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
这篇关于如何在Go中设置/获取protobuf的扩展字段?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!