当前位置: 首页 > 知识库问答 >
问题:

如何在Go中设置/获取protobuf的扩展字段?

程飞星
2023-03-14

我是Go语言开发者。我们的团队选择使用协议缓冲区来转换数据。我选择了这个protobuf包:https://github.com/golang/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中设置/获取扩展名字段?

共有2个答案

钱季
2023-03-14

发件人:https://developers.google.com/protocol-buffers/docs/reference/go-generated#extensions

例如,给定以下定义:

extend Foo {
  optional int32 singular_int32 = 1;
  repeated bytes repeated_string = 2;
  optional Bar repeated_message = 3;
}

可通过以下方式访问扩展值:

m := &somepb.Foo{}
proto.SetExtension(m, extpb.E_SingularInt32, int32(1))
proto.SetExtension(m, extpb.E_RepeatedString, []string{"a", "b", "c"})
proto.SetExtension(m, extpb.E_RepeatedMessage, &extpb.Bar{})

v1 := proto.GetExtension(m, extpb.E_SingularInt32).(int32)
v2 := proto.GetExtension(m, extpb.E_RepeatedString).([][]byte)
v3 := proto.GetExtension(m, extpb.E_RepeatedMessage).(*extpb.Bar)
蒋栋
2023-03-14

得到分机。。。

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: (*int32)(nil),

让我觉得这将是一个单一的领域,而我们的扩展看起来更像

ExtensionType: (*SomeOtherType)(nil),

这是一个很好的资源测试ExtensionsRoundTrip

 类似资料:
  • 我为我创建的驱动程序的测试创建了一个自定义标记。我正在寻找一种方法,使用新的Junit5 jupiter扩展在beforeach和AfterEach期间初始化和退出这个驱动程序。 我看到有一个AnnotationSupport.class应该可以帮助你获得用特定注释标注的字段,但是没有找到任何例子。 我想要的只是能够使用扩展中用我的注释标注的字段。

  • 我有一个proto,它有一条包含扩展名的消息 我有另一个proto,它有扩展(只显示下面的一个扩展) 通过protobuf代码,我能够获得MsgB的描述符和FileDescriptor,并从中检索FieldDescriptor类型的扩展名“MsgB”。我通过protobuf代码查找扩展,而不是使用MsgB协议生成的代码,因为我试图迭代所有扩展消息,而不是将每个消息硬编码为可变扩展。(我理解Muta

  • 问题内容: 我希望获取正在上传的图像的文件扩展名,但我只获得了一个数组。 有没有办法只是获得扩展本身? 问题答案: 无需使用字符串函数。您可以使用实际为您想要的东西设计的东西:

  • 问题内容: 创建像这样的结构后: 如何创建Foo的新实例并设置并获取名称?我尝试了以下方法: 没有打印任何内容,因为名称为空。那么如何设置结构中的字段? 工作操场 问题答案: 评论(和工作)示例: 测试并进行Go之旅,以了解有关方法和指针以及Go的基础知识的更多信息。

  • 目前开源社区已经围绕Protobuf和gRPC开发出众多扩展,形成了庞大的生态。本节我们将简单介绍验证器和REST接口扩展。 4.6.1 验证器 到目前为止,我们接触的全部是第三版的Protobuf语法。第二版的Protobuf有个默认值特性,可以为字符串或数值类型的成员定义默认值。 我们采用第二版的Protobuf语法创建文件: syntax = "proto2"; package main;

  • 本文向大家介绍php如何获取文件的扩展名,包括了php如何获取文件的扩展名的使用技巧和注意事项,需要的朋友参考一下 网上也有很多类似的方法,不过都存在这样那样的不严谨的问题,本文就不一一分析了,这里只给出最正确的利用php 获取文件扩展名(文件后缀名)的方法。 函数中用到了php内置函数pathinfo 这个函数,下面分析一下这个函数的意思和用法: 定义和用法 pathinfo() 函数以数组的形