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

求助 pb 生成结构体, 字段风格问题

  •  
  •   crazystory · 2023-03-22 17:53:33 +08:00 · 1259 次点击
    这是一个创建于 610 天前的主题,其中的信息可能已经有所发展或是发生改变。

    pb 定义

    message User {
      int64 user_id = 1;
    }
    

    go 结构体

    type User struct {
    	state         protoimpl.MessageState
    	sizeCache     protoimpl.SizeCache
    	unknownFields protoimpl.UnknownFields
    
    	UserId int64 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
    }
    
    

    如上定义, 生成的结构体在接收 json 参数的时候 传递的参数如下

    {"userId":1000}
    
    
    {"user_id":1000}
    

    如上描述, pb 生成的结构体在接收 json 参数的时候, 对应的参数能接收 user_id 也能接收 userId. 两种风格的参数都能正确传递, 这样虽然可以用, 但是对 api 定义不太严谨. 查阅了一些资料没找到解决方案 希望只能接收一种风格的参数, 要么 user_id 要么 userId

    有大佬解答一下吗

    4 条回复    2023-03-23 13:46:53 +08:00
    coderxy
        1
    coderxy  
       2023-03-22 18:00:13 +08:00
    protobuf json tag 搜一下
    crazystory
        2
    crazystory  
    OP
       2023-03-22 18:26:16 +08:00
    @coderxy 感谢
    但是现在遇到了新的问题
    ```
    int64 user_id = 1 [json_name="userId"];
    ```

    如果 json_name 定义为 user_id 的情况下 已经不可以接收 userId 这样的驼峰参数
    但是如果 json_name 为上面的 userId 依然同时可以接收两种类型的参数

    现在考虑到前端的工作量, 计划仅保留驼峰风格
    coderxy
        3
    coderxy  
       2023-03-22 18:58:01 +08:00
    定义两个字段 一个 userId 一个 user_id ,自己在处理时兼容一下
    zizon
        4
    zizon  
       2023-03-23 13:46:53 +08:00
    https://github.com/golang/protobuf/blob/master/protoc-gen-go/generator/generator.go#L2225
    看这里主要看下怎么控制 name/field_name/json_name 统一吧.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3071 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 18ms · UTC 13:33 · PVG 21:33 · LAX 05:33 · JFK 08:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.