问题标签 [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 投票
1 回答
500 浏览

go - Protobuf 生成的文件无法识别导入路径

我有一个 proto 文件product.proto,我想在catalog.proto. 我可以成功导入product.protocatalog.proto但自动生成catalog.pb.go的无法重新调整其依赖项的路径,即product.pb.go. 它指出:


无法导入目录/pb/entities(在 /usr/local/go/src/catalog/pb/entities(来自 $GOROOT) /Users/trimulabs/go/src/中找不到包“catalog/pb/entities”目录/pb/entities(来自 $GOPATH))

目录结构

目录.proto

产品.proto

有人可以帮忙吗?

0 投票
0 回答
36 浏览

protocol-buffers - 您如何看待可选作为 protobuf 字段名称的前缀?

proto3开始,protobuf 规范去掉了optionalandrequired字段。现在只能通过查看文档来确定消息中的字段是否可选的唯一方法,这不是很方便。我们如何将optional_其用作可选字段的字段名称的前缀。

optional_前缀:

原型缓冲区 代码

optional_前缀:

原型缓冲区 代码

我通常没有看到这样命名的可选字段。它在我过去的一个团队中使用过,非常方便。您对此有什么特别的看法吗?

0 投票
1 回答
436 浏览

go - 在 golang 中不使用 protoc 生成 .pb 文件

我正在尝试.pb.go使用service.protoGo 中的文件输入生成文件。

有没有办法在不使用protoc二进制的情况下做到这一点(比如直接使用 package github.com/golang/protobuf/protoc-gen-go)?

0 投票
1 回答
348 浏览

go - 没有收到来自远程调用的错误,一直到超时 Go gRPC + micro + protobuf

我最近开始使用 Go 学习微服务,并且偶然发现了一些使用 micro、gRPC 和 protobuf 的教程。一段时间后,我意识到我没有收到来自为与微服务通信而创建的 cli 的任何错误消息。下面的代码能够重现这一点。

当客户端使用参数Dawid运行时,一切都按预期工作,但是如果我尝试其他任何操作,我确实希望客户端出现错误并显示消息Bad name,但我收到的只是默认 5 秒等待时间后的超时。

回购链接:https ://github.com/dbielecki97/grpc-errors

0 投票
1 回答
614 浏览

go - Go 的 Protoc-gen-gogo 编译器问题

github.com/gogo/protobuf/proto [ok] github.com/gogo/protobuf/protoc-gen-gogo[ok] github.com/gogo/protobuf/gogoproto[ok] google.golang.org/grpc[ok]

协议 --gogo_out=。迎接

请帮我

0 投票
1 回答
70 浏览

go - protoc Go 包命令本地覆盖?

按照 gRPC 官方网站上的 Quick Start gRPC Go 指南,它有一个步骤要求用户使用以下命令重新编译更新的 .proto 文件:

我对“人工编写的”Go 代码如何使用新编译的 protobuf 文件感到有些困惑。

在示例“人工编写的”Go 代码中,他们使用以下导入引用 protobuf 代码:

protoc不更新这个包,而是更新helloworld/helloworld.proto运行命令所在的同一目录中的包。命令如何protoc确保“人工编写”的 Go 代码使用新编译的 protobuf 代码?

0 投票
1 回答
586 浏览

go - 使用 zap logger 将 protobuf 消息正确记录为未转义的 JSON

我有一个 Go 项目,我在其中使用Zap结构化日志记录来记录结构的内容。这就是我初始化记录器的方式:

最初,我从我自己的带有 json 标签的结构开始,一切都很完美:

结果:

我现在切换到 protobuf 并且我正在努力实现相同的结果。最初,当使用 zap.Any() 时,我刚刚获得了“反射地图”版本:

我尝试使用 jsonpb marshaller 对对象进行编组,它在自身上生成了正确的输出,但是,当我在 中使用它时zap.String(),字符串被转义,所以我在每个引号前得到了一组额外的 '\'。由于稍后会处理日志,这会导致那里出现问题,因此我想避免它:

结果:

然后我尝试使用zap.Reflect()而不是zap.Any()最接近我需要的东西,除了枚举被呈现为它们的数值(初始解决方案没有枚举,因此在 pre-protobuf 解决方案中也不起作用):

结果:

到目前为止,我看到的唯一选择是编写自己的MarshalLogObject()函数:

但由于它是一个复杂的结构,我宁愿使用不易出错且维护繁重的解决方案。理想情况下,我会告诉 zap 以某种方式使用 jsonpb 编组器,但我不知道这是否可能。

0 投票
2 回答
341 浏览

go - GoLang Protobuf:如何使用同一个 tcp 连接发送多条消息?

我正在使用 GoLang protobuf 对通过单个 tcp 连接发送的消息进行编码(和解码)。

.proto 结构

然后我使用该protoc工具生成相应的存根。

这就是我将内容写入线路的方式。

这就是我在接收方阅读和解组的方式。

如果对于每个 protobuf 消息,都会产生一个新的 tcp 连接,则上述方法可以正常工作。但是当使用单个 tcp 连接来传输多个消息(持久连接)时,解组失败并出现错误proto: invalid field number

出现此问题的原因是,使用单个连接发送的 protobuf 消息不强制任何消息边界,因此在读取缓冲区时可以包含对应于 1) 多个 protobuff 消息和 2) 部分 protobuff 消息的字节length, err := wire.Read(data)data

protobuf 文档提到以下作为解决方案。

如果要将多条消息写入单个文件或流,则由您来跟踪一条消息的结束位置和下一条消息的开始位置。协议缓冲区有线格式不是自定界的,因此协议缓冲区解析器无法自行确定消息的结束位置。解决此问题的最简单方法是在编写消息本身之前写入每条消息的大小。当您读回消息时,您读取大小,然后将字节读入单独的缓冲区,然后从该缓冲区解析。(如果您想避免将字节复制到单独的缓冲区,请查看 CodedInputStream 类(在 C++ 和 Java 中),它可以被告知将读取限制为一定数量的字节。)

虽然这是一种直观的方法,但它归结为一个先有鸡还是先有蛋的问题。写入线路的字节数组的长度(取自data, err := proto.Marshal(t); len(data))不是固定的,也不知道表示这个数字需要多少字节(len(data))。现在我们遇到了同样的问题,如何将字节数组的长度发送到接收方读取,而不知道实际需要多少字节length(换句话说,接收方如何知道对应的字节数到场length

对此有什么建议吗?

谢谢

0 投票
1 回答
142 浏览

go - Grpc Go Generated.pb.go 导入未格式化

我将 proto 文件(validator.proto)从我的一个项目https://github.com/maanasasubrahmanyam-sd/customValidation导入到另一个项目(test.proto)https://github.com/maanasasubrahmanyam-sd/customeValTest/tree /master/interfaces/test_server

正确的导入应该是 github.com/maanasasubrahmanyam-sd/customValidation/validator。但 test.pb.go 导入以_ "./validator"的形式出现,在 Goland 中显示红线。

编辑 - 所有 pb.go 文件都显示错误。我怀疑这是由于进口不良。

我用谷歌搜索但没有找到任何相关信息。有什么建议专家吗?

0 投票
1 回答
205 浏览

go - Go build 命令抛出 - 恐慌:接口转换:接口 {} 是 []uint8,而不是 *validator.FieldValidator

在下面的 Go 函数中,当我尝试运行 build 命令生成 pb.go 文件时出现错误。恐慌:接口转换:接口 {} 是 []uint8,而不是 *validator.FieldValidator github.com/mygithub/myproject/plugin.getFieldValidatorIfAny(0xc0001d4b60, 0x5b5020)

有关如何解决此问题的任何建议

我正在尝试使用https://github.com/mwitkow/go-proto-validators添加验证