问题标签 [protobuf-go]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
7006 浏览

go - Go Struct 中的 Go Protobuf 声明和可选字段(字符串指针)

我在使用 Protoc 和包含可空字符串字段的现有结构时遇到了一些问题。

我试图序列化以进行传输的结构包含一堆在 json 中可以为空的字段(因此我们可以区分null,""和一个设定值)。

因此,如果用户发送一个空的 json 字符串{},则 Path 将是nil而不是"",而{"path":""}它也是有效的,并且与{"path": null}.

我提出的proto3声明显然看起来像这样(并且是可选的,required并且optional从 proto3 中删除:

运行 Protoc 后,我最终得到一个看起来像这样的结构,并且所有值都是string并且无法将它们声明为*string

显然我不能从我现有的结构中分配给这个数组。但是,即使我要target.Path = *source.Path使用适当的空指针检查等编写繁琐的映射代码,我也会失去源结构 ( nil, "", "value") 的三重含义。

关于如何在此处进行操作或 Go Protobuf 是否有扩展来执行此操作的任何建议?或者如何描述这个原型声明?

0 投票
1 回答
1315 浏览

go - 编译 protobuf 并尝试在其他包中使用它时未定义的结构的 MarshalToSizedBuffer

我正在使用 gogo/protobuf 为 gRPC 调用生成 protobuf,但最近由于编组方法未正确生成,它们开始失败。错误如下所示:

我尝试使用不同的 gvm 重新安装 go 和 goenv,并恢复对 proto 文件的更改。这个问题似乎在我们的 proto 文件的最后一个稳定分支上解决了,但是如果我进行任何更改,问题就会再次出现。这涉及两个存储库,一个(原始文件存储库)使用 golang 1.11.1,另一个使用 golang 1.12.5。

我期望在使用包时需要生成 protobufs 的所有方法。

0 投票
1 回答
231 浏览

go - 如何使用 gogo/protobuf 获取自定义 go 类型

我在 .proto 文件中的代码目前如下所示:

当我运行protoc --gogofaster_out=. *.proto输出时,我得到的是:

但我真正想要的是:

.proto 文件中的代码需要什么才能获得所需的输出?

0 投票
1 回答
146 浏览

c - 如何从 C 库中检索 probuf

我正在尝试使用 Google 协议缓冲区与来自 Go 的 C 库进行通信,但我无法使其工作。我在尝试将 protobuf 发送到 C 库时遇到错误

我将发布最少的代码来重现我现在面临的错误(我已经删除了大部分 C 部分,因为它与此错误无关):

我收到以下错误:

0 投票
1 回答
262 浏览

protocol-buffers - 关于默认值,如何在 GO 和 JS 之间进行标准序列化输出?

我取一段数据并将其放在 GO 和 JS 中的 protobuf 中,然后在每个平台上对 PB 进行编码,得到的序列化值不同。由于我们使用编码值进行签名和散列,因此它们匹配至关重要。据我所知,我认为不同之处在于 JS 在编码输出中包含默认值,而 GO 没有。

两个平台都从同一段 JSON 开始。这是GO:

来自 GO 的 base64 编码值为:

下面是 JS 的作用:

结果是:

...这与 GO 提出的不同。

如果我将这两个 base64 字符串都带入 JS,将它们解码为 PB,然后toJSON()将 PB 解码并查看两个对象的差异,看起来不同之处在于 JS 正在序列化默认值而 GO 不是(JS 开启正确的)。

在此处输入图像描述

我试过这样序列化 JS,但结果是一样的:

那么,有什么方法可以使两个平台之间的输出保持一致?原始 JSON 输入是相同的,但输出的结果不同。

0 投票
1 回答
2798 浏览

go - 如何在golang proto生成的复杂结构中获取所有字段名称

我正在尝试获取从 proto 生成的 go 文件中的所有字段名称。下面是生成的结构。

可以看出,ActionType 是 proto 中的一个字段,实现如下。

因为我想在 TaskAction 结构中获取字段名称,即 Progress。

我正在使用下面的代码来获取字段名称,但如果字段类型是接口(对于 oneof 字段),则会遇到问题

0 投票
0 回答
707 浏览

docker - 尝试使用 Uber Prototool 访问生成的 protobuf 时权限被拒绝

我正在尝试使用我遇到的https://github.com/uber/prototool 。我创建了一个简单的 repo protobufs,并编写了一个简单的脚本来在 docker 容器中生成我的 proto 文件,该容器会提取图像uber-prototool. Code ingenerate.sh` 文件:

还有一个 prototool.yaml 文件,看起来像

我成功生成了 proto 文件,但是Permission Denied在尝试cd进入生成的名为gen. 这是一个隐藏文件,只有在我使用sudo. 它也无法显示隐藏文件夹vscode。我不想一直 sudo 进入隐藏文件夹,而是希望非 root 用户能够访问。我该如何解决这个问题?

这是作为 root 用户生成的 repo 的屏幕截图: 在此处输入图像描述

0 投票
1 回答
259 浏览

go - 在 Golang 中解组 Protobuf ( proto2 ) 后如何设置可选参数?

我在 protobuf 中有 5 个字段(3 个必填字段和 2 个可选字段)。从生产者端,我将发送 3 个必需的文件(编组)并在消费者端获取(解组)3 个必需的文件。现在,我想在消费者端添加这两个可选参数值。可能吗 ?如果是,如何?

提前致谢

0 投票
0 回答
588 浏览

go - 如何从 protobuf 文件生成字符串切片的映射?

正如协议缓冲区文档所述:

每个映射字段在类型结构中生成一个字段, map[TKey]TValue其中TKey字段的键类型TValue是字段的值类型...

我想设置TValue为一段字符串。所以在 Go 中它会生成:

还考虑到关于重复字段的注释:

同样,对于字段定义repeated bytes foo = 1;,编译器将生成一个 Go 结构体,其中包含一个[][]byte名为Foo

我正在尝试执行以下操作:

但这只是吐出一个错误:

我可以这样做:

输出:

但是,在实现Params中将需要用作一个url.Values来构建查询字符串。最后一个解决方案需要额外的迭代,并将数据复制到一个 newmap[string][]string中,我想避免这种情况。

(如何)我可以让协议缓冲区生成字符串切片的(Go)映射吗?我正在使用 gRPC 插件。

0 投票
1 回答
1031 浏览

go - 将文档插入 mongodb,其中一个字段具有动态结构

我正在尝试使用 Go 插入 MongoDB,其中一个字段将具有动态数据。就我而言,它将通过 gRPC 来自其他服务,但我将示例简化为:

我得到一个错误:cannot transform type main.siteItem to a BSON Document: no encoder found for structpb.isValue_Kind

如果我使用string而不是*_struct.Value- 它工作得很好。但在我的情况下Data:,可能有来自 JSON 的任何价值。