Golang Go语言中求助 pb 生成结构体, 字段风格问题

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

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

有大佬解答一下吗


Golang Go语言中求助 pb 生成结构体, 字段风格问题

更多关于Golang Go语言中求助 pb 生成结构体, 字段风格问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

protobuf json tag 搜一下

更多关于Golang Go语言中求助 pb 生成结构体, 字段风格问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


感谢
但是现在遇到了新的问题
<br> int64 user_id = 1 [json_name="userId"];<br>

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

现在考虑到前端的工作量, 计划仅保留驼峰风格

定义两个字段 一个 userId 一个 user_id ,自己在处理时兼容一下

在Go语言中,使用Protocol Buffers(简称Protobuf)生成结构体时,字段风格(如驼峰式、下划线式等)通常是由你的.proto文件中定义的字段名称决定的。Protobuf工具(如protoc-gen-go)会根据这些字段名称生成对应的Go结构体字段。

如果你希望生成的Go结构体字段风格与你的项目代码风格一致,你可以在.proto文件中做如下调整:

  1. 保持字段名称一致性:直接在.proto文件中使用你希望的字段风格。例如,如果你希望使用驼峰式命名,那么就在.proto文件中使用驼峰式命名字段。

  2. 使用json_name选项:如果你需要在JSON序列化/反序列化时使用不同的字段名称,可以使用json_name选项来指定JSON中的字段名称,而不影响Go结构体中的字段名称。

    message MyMessage {
        string my_field = 1 [(gogoproto.jsontag) = "myField"];  // 假设使用gogoproto扩展
        // 或者使用标准的json_name选项(如果支持的话)
        // string my_field = 1 [json_name = "myField"];
    }
    

    注意:gogoproto.jsontaggogo/protobuf插件的一个扩展,标准Protobuf可能不支持json_name选项直接用于字段。如果你使用的是标准protoc-gen-go,可能需要查找其他方法或插件来实现类似功能。

总之,通过调整.proto文件中的字段名称和选项,你可以控制生成的Go结构体字段的风格。

回到顶部