如何设置/获取protobuf';Go中的扩展字段是什么?

如何设置/获取protobuf';Go中的扩展字段是什么?,go,protocol-buffers,Go,Protocol Buffers,我是一个围棋语言开发者。我们的团队选择使用协议缓冲区来转换数据。 我选择了这个protobuf包:。 但是,此包没有处理协议缓冲区中的扩展字段的方法。我只在protoc生成的类文件中找到了以下代码: var E_Height = &proto.ExtensionDesc{ ExtendedType: (*Person)(nil), ExtensionType: (*int32)(nil), Field: 110, Name:

我是一个围棋语言开发者。我们的团队选择使用协议缓冲区来转换数据。 我选择了这个protobuf包:。 但是,此包没有处理协议缓冲区中的
扩展
字段的方法。我只在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类型