go获取项目内所有proto,如何在Go中设置/获取protobuf的扩展字段?

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值