V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
bruce0
V2EX  ›  Go 编程语言

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

  •  
  •   bruce0 · 2022-08-10 10:25:34 +08:00 · 1651 次点击
    这是一个创建于 872 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    5 条回复    2022-08-10 15:16:41 +08:00
    joesonw
        1
    joesonw  
       2022-08-10 11:28:52 +08:00 via iPhone
    gogo 里面有保留关键字。Size 是生成里面有这个方法。禁用 sizer ,使用 protosizer
    joesonw
        2
    joesonw  
       2022-08-10 11:29:32 +08:00 via iPhone
    bruce0
        3
    bruce0  
    OP
       2022-08-10 14:51:44 +08:00
    @joesonw 确实, 通过 `option (gogoproto.protosizer_all) = true;` 能 生成 protosizer, 但是 gogofast 这个插件不支持 protosizer, gogo 这个插件可以, 但是 Benchmark 测试下来, gogo 的性能比 gogofast 差好多,难受
    joesonw
        4
    joesonw  
       2022-08-10 14:59:07 +08:00 via iPhone   ❤️ 1
    @bruce0 move on 吧。gogo 已经不维护了,proto codec 是性能瓶颈吗?一般情况下都是 i/o 先到瓶颈。
    bruce0
        5
    bruce0  
    OP
       2022-08-10 15:16:41 +08:00
    @joesonw 没到瓶颈,就是在切项目(祖传代码弄一个新的项目), 看到 gogo 比 go 官方自带的吊,想换一个.
    确实 proto 的编码和解码目前还没到瓶颈, 没必要追求极致性能, gogo 能做到不修改代码,只修改一点点 proto 文件, 就用 gogo 吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2715 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 11:45 · PVG 19:45 · LAX 03:45 · JFK 06:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.