如何设置/获取protobuf';Go中的扩展字段是什么?
我是一个围棋语言开发者。我们的团队选择使用协议缓冲区来转换数据。 我选择了这个protobuf包:。 但是,此包没有处理协议缓冲区中的如何设置/获取protobuf';Go中的扩展字段是什么?,go,protocol-buffers,Go,Protocol Buffers,我是一个围棋语言开发者。我们的团队选择使用协议缓冲区来转换数据。 我选择了这个protobuf包:。 但是,此包没有处理协议缓冲区中的扩展字段的方法。我只在protoc生成的类文件中找到了以下代码: var E_Height = &proto.ExtensionDesc{ ExtendedType: (*Person)(nil), ExtensionType: (*int32)(nil), Field: 110, Name:
扩展
字段的方法。我只在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
字段呢?获取扩展
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
}
正在设置扩展名
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: (*SomeOtherType)(nil),
然后将高度设置为单个字段,而不是单独的原型
这条线
ExtensionType: (*int32)(nil),
让我觉得它将是一个单一的字段,而我们的扩展看起来更像
height := proto.Int32(120)
ExtensionType: (*SomeOtherType)(nil),
这是一个很好的资源
查看protobuf库中扩展处理代码的源代码。我得到的印象是,他们不希望您直接访问
extensions
字段,但您可以使用API函数获取和设置扩展,如GetExtensions
。有GetExtension
、GetExtensions
和setextension
。你需要做那些函数无法处理的事情吗?嗨@sberry,如果你有大量的扩展怎么办?有没有办法通过字符串获取扩展类型?意思是人有exu类型