The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
bruce0

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

  •  
  •   bruce0 · Aug 10, 2022 · 2055 views
    This topic created in 1380 days ago, the information mentioned may be changed or developed.

    使用 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 replies    2022-08-10 15:16:41 +08:00
    joesonw
        1
    joesonw  
       Aug 10, 2022 via iPhone
    gogo 里面有保留关键字。Size 是生成里面有这个方法。禁用 sizer ,使用 protosizer
    joesonw
        2
    joesonw  
       Aug 10, 2022 via iPhone
    bruce0
        3
    bruce0  
    OP
       Aug 10, 2022
    @joesonw 确实, 通过 `option (gogoproto.protosizer_all) = true;` 能 生成 protosizer, 但是 gogofast 这个插件不支持 protosizer, gogo 这个插件可以, 但是 Benchmark 测试下来, gogo 的性能比 gogofast 差好多,难受
    joesonw
        4
    joesonw  
       Aug 10, 2022 via iPhone   ❤️ 1
    @bruce0 move on 吧。gogo 已经不维护了,proto codec 是性能瓶颈吗?一般情况下都是 i/o 先到瓶颈。
    bruce0
        5
    bruce0  
    OP
       Aug 10, 2022
    @joesonw 没到瓶颈,就是在切项目(祖传代码弄一个新的项目), 看到 gogo 比 go 官方自带的吊,想换一个.
    确实 proto 的编码和解码目前还没到瓶颈, 没必要追求极致性能, gogo 能做到不修改代码,只修改一点点 proto 文件, 就用 gogo 吧
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1174 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 23:19 · PVG 07:19 · LAX 16:19 · JFK 19:19
    ♥ Do have faith in what you're doing.