如何在Go中设置/获取protobuf的扩展字段? [英] How to set/get protobuf's extension field in Go?

查看:1093
本文介绍了如何在Go中设置/获取protobuf的扩展字段?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆