Golang Go语言中使用gogo protobuf遇到的一个问题,求解答

发布于 1周前 作者 wuwangju 来自 Go语言

使用 protobuf 定义一个结构

message One {
  required uint32 type = 1;
  required uint32 value = 2;
  required uint32 size = 3;
}

使用 protobuf 官方的 go 插件得到的代码

type One struct {
	Type             *uint32 `protobuf:"varint,1,req,name=type" json:"type,omitempty"`
	Value            *uint32 `protobuf:"varint,2,req,name=value" json:"value,omitempty"`
	Size             *uint32 `protobuf:"varint,3,req,name=size" json:"size,omitempty"`
	XXX_unrecognized []byte  `json:"-"`
}

这里的 Size 字段是正常的,没有被修改,如果使用 gogoproto 插件生成的代码,就是这样的

type One1 struct {
	Type                 *uint32  `protobuf:"varint,1,req,name=type" json:"type,omitempty"`
	Value                *uint32  `protobuf:"varint,2,req,name=value" json:"value,omitempty"`
	Size_                *uint32  `protobuf:"varint,3,req,name=size" json:"size,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

Size 字段被编译成 Size_了 有没有办法解决这个问题呢

如果是新项目还好,这个是老的项目,有很多关联代码,修改起来好痛苦😭


Golang Go语言中使用gogo protobuf遇到的一个问题,求解答

更多关于Golang Go语言中使用gogo protobuf遇到的一个问题,求解答的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

6 回复

gogo 里面有保留关键字。Size 是生成里面有这个方法。禁用 sizer ,使用 protosizer

更多关于Golang Go语言中使用gogo protobuf遇到的一个问题,求解答的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


确实, 通过 option (gogoproto.protosizer_all) = true; 能 生成 protosizer, 但是 gogofast 这个插件不支持 protosizer, gogo 这个插件可以, 但是 Benchmark 测试下来, gogo 的性能比 gogofast 差好多,难受

move on 吧。gogo 已经不维护了,proto codec 是性能瓶颈吗?一般情况下都是 i/o 先到瓶颈。

没到瓶颈,就是在切项目(祖传代码弄一个新的项目), 看到 gogo 比 go 官方自带的吊,想换一个.
确实 proto 的编码和解码目前还没到瓶颈, 没必要追求极致性能, gogo 能做到不修改代码,只修改一点点 proto 文件, 就用 gogo 吧

在Golang中使用gogo protobuf时遇到问题,通常可能涉及多个方面,包括protobuf定义文件(.proto)、gogo插件的使用、Go代码生成以及编译过程中的配置等。以下是一些常见的排查步骤和建议,希望能帮助你解决问题:

  1. 检查.proto文件

    • 确保.proto文件中的语法正确无误。
    • 检查是否有未定义的字段类型或消息。
    • 验证是否所有需要的import都已正确引入。
  2. gogo插件配置

    • 确保gogo protobuf的插件已正确安装,并且版本与你的protobuf编译器兼容。
    • 使用protoc --gogo_out时,检查指定的输出目录和参数是否正确。
  3. 代码生成

    • 运行protoc命令时,查看是否有错误信息输出,这通常会指出具体的问题所在。
    • 检查生成的Go文件,看是否有明显的编译错误或不一致。
  4. 编译问题

    • 确保你的Go环境配置正确,包括GOPATH和GOROOT。
    • 如果使用了模块(Go Modules),确保你的go.mod文件中已正确声明了依赖。
  5. 查阅文档和社区

    • 查阅gogo protobuf的官方文档,了解最新的使用方法和最佳实践。
    • 搜索相关的GitHub issues或Stack Overflow帖子,看是否有人遇到过类似问题。

如果上述步骤仍未解决问题,你可以提供更具体的错误信息或代码片段,以便进一步分析。希望这些建议能对你有所帮助!

回到顶部