问题标签 [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.
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 是否有扩展来执行此操作的任何建议?或者如何描述这个原型声明?
go - 编译 protobuf 并尝试在其他包中使用它时未定义的结构的 MarshalToSizedBuffer
我正在使用 gogo/protobuf 为 gRPC 调用生成 protobuf,但最近由于编组方法未正确生成,它们开始失败。错误如下所示:
我尝试使用不同的 gvm 重新安装 go 和 goenv,并恢复对 proto 文件的更改。这个问题似乎在我们的 proto 文件的最后一个稳定分支上解决了,但是如果我进行任何更改,问题就会再次出现。这涉及两个存储库,一个(原始文件存储库)使用 golang 1.11.1,另一个使用 golang 1.12.5。
我期望在使用包时需要生成 protobufs 的所有方法。
go - 如何使用 gogo/protobuf 获取自定义 go 类型
我在 .proto 文件中的代码目前如下所示:
当我运行protoc --gogofaster_out=. *.proto
输出时,我得到的是:
但我真正想要的是:
.proto 文件中的代码需要什么才能获得所需的输出?
c - 如何从 C 库中检索 probuf
我正在尝试使用 Google 协议缓冲区与来自 Go 的 C 库进行通信,但我无法使其工作。我在尝试将 protobuf 发送到 C 库时遇到错误
我将发布最少的代码来重现我现在面临的错误(我已经删除了大部分 C 部分,因为它与此错误无关):
我收到以下错误:
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 输入是相同的,但输出的结果不同。
go - 如何在golang proto生成的复杂结构中获取所有字段名称
我正在尝试获取从 proto 生成的 go 文件中的所有字段名称。下面是生成的结构。
可以看出,ActionType 是 proto 中的一个字段,实现如下。
因为我想在 TaskAction 结构中获取字段名称,即 Progress。
我正在使用下面的代码来获取字段名称,但如果字段类型是接口(对于 oneof 字段),则会遇到问题
docker - 尝试使用 Uber Prototool 访问生成的 protobuf 时权限被拒绝
我正在尝试使用我遇到的https://github.com/uber/prototool 。我创建了一个简单的 repo protobufs
,并编写了一个简单的脚本来在 docker 容器中生成我的 proto 文件,该容器会提取图像uber-prototool.
Code in
generate.sh` 文件:
还有一个 prototool.yaml 文件,看起来像
我成功生成了 proto 文件,但是Permission Denied
在尝试cd
进入生成的名为gen
. 这是一个隐藏文件,只有在我使用sudo
. 它也无法显示隐藏文件夹vscode
。我不想一直 sudo 进入隐藏文件夹,而是希望非 root 用户能够访问。我该如何解决这个问题?
go - 在 Golang 中解组 Protobuf ( proto2 ) 后如何设置可选参数?
我在 protobuf 中有 5 个字段(3 个必填字段和 2 个可选字段)。从生产者端,我将发送 3 个必需的文件(编组)并在消费者端获取(解组)3 个必需的文件。现在,我想在消费者端添加这两个可选参数值。可能吗 ?如果是,如何?
提前致谢
go - 如何从 protobuf 文件生成字符串切片的映射?
正如协议缓冲区文档所述:
每个映射字段在类型结构中生成一个字段,
map[TKey]TValue
其中TKey
字段的键类型TValue
是字段的值类型...
我想设置TValue
为一段字符串。所以在 Go 中它会生成:
还考虑到关于重复字段的注释:
同样,对于字段定义
repeated bytes foo = 1;
,编译器将生成一个 Go 结构体,其中包含一个[][]byte
名为Foo
我正在尝试执行以下操作:
但这只是吐出一个错误:
我可以这样做:
输出:
但是,在实现Params
中将需要用作一个url.Values
来构建查询字符串。最后一个解决方案需要额外的迭代,并将数据复制到一个 newmap[string][]string
中,我想避免这种情况。
(如何)我可以让协议缓冲区生成字符串切片的(Go)映射吗?我正在使用 gRPC 插件。
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 的任何价值。