使用 gogo protobuf 遇到的一个问题,求解答

2022-08-10 10:25:34 +08:00
 bruce0

使用 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_了 有没有办法解决这个问题呢

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

1504 次点击
所在节点    Go 编程语言
5 条回复
joesonw
2022-08-10 11:28:52 +08:00
gogo 里面有保留关键字。Size 是生成里面有这个方法。禁用 sizer ,使用 protosizer
joesonw
2022-08-10 11:29:32 +08:00
bruce0
2022-08-10 14:51:44 +08:00
@joesonw 确实, 通过 `option (gogoproto.protosizer_all) = true;` 能 生成 protosizer, 但是 gogofast 这个插件不支持 protosizer, gogo 这个插件可以, 但是 Benchmark 测试下来, gogo 的性能比 gogofast 差好多,难受
joesonw
2022-08-10 14:59:07 +08:00
@bruce0 move on 吧。gogo 已经不维护了,proto codec 是性能瓶颈吗?一般情况下都是 i/o 先到瓶颈。
bruce0
2022-08-10 15:16:41 +08:00
@joesonw 没到瓶颈,就是在切项目(祖传代码弄一个新的项目), 看到 gogo 比 go 官方自带的吊,想换一个.
确实 proto 的编码和解码目前还没到瓶颈, 没必要追求极致性能, gogo 能做到不修改代码,只修改一点点 proto 文件, 就用 gogo 吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/871856

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX