Protoc-go修改生成的文件的结构体的tag
使用场景
在使用protoc生成的文件中生成的结构体的json没有小写,有时候我们就需要使用小写,最主要的就是在使用gin的时候还需要使用bind来绑定上传的东西。但是生成的*.pd.go又不建议我们去改。这时候就需要使用protoc-go-inject-tag,这里还有个更重要的地方,这里简单描述下:生成的结构体中的tag里面有个omitempty
,这个的作用呢,就是在数据传输过程中,自动去掉false 0 ""
这些数据。这里简单的举个例子,比如你的grpc服务端返回给客户端一个值为false的bool类型数据。但是在客户端接受的时候,这个字段就直接没有了。所以这样肯定是不行的。所以这里需要集体的去掉tag中的omitempty
。这个时候protoc-go-inject-tag就可以满足这个需求。在之后的微服务(go-micro)开发中,这个也是很重要的地方!
git地址:https://github.com/favadi/protoc-go-inject-tag
安装
go get github.com/favadi/protoc-go-inject-tag
使用
只需要在.proto文件中写注释
syntax = "proto3";
package study;
// 请求参数
message Token {
// @inject_tag: json:"jwtToken" form:"jwtToken"
string jwtToken = 1; //1为字段顺序
// @inject_tag: json:"timeStamp" form:"timeStamp"
int64 timeStamp = 2;
}
// 返回参数
message TokenRequest {
// @inject_tag: json:"isLogin" form:"isLogin"
bool IsLogin = 1;
}
// 定义服务Auth
// 服务方法CheckToken
// Token传入的值
// TokenRequest输出的值
// 生成兼容grpc的go文件
// protoc --go_out=plugins=grpc:. *.proto
service Auth {
rpc CheckToken (Token) returns (TokenRequest);
}
执行生成pb文件
protoc --go_out=plugins=grpc:. *.proto
执行修改tag 命令
protoc-go-inject-tag -input=./*.pb.go
执行结果
这个时候查看生成的文件就变成了这样
// 请求参数
type Token struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// @inject_tag: json:"jwtToken" form:"jwtToken"
JwtToken string `protobuf:"bytes,1,opt,name=jwtToken,proto3" json:"jwtToken" form:"jwtToken"` //1为字段顺序
// @inject_tag: json:"timeStamp" form:"timeStamp"
TimeStamp int64 `protobuf:"varint,2,opt,name=timeStamp,proto3" json:"timeStamp" form:"timeStamp"`
}
// 返回参数
type TokenRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// @inject_tag: json:"isLogin" form:"isLogin"
IsLogin bool `protobuf:"varint,1,opt,name=IsLogin,proto3" json:"isLogin" form:"isLogin"`
}
这样就行了,还可以根据自己的需求,自定义tag
本文使用CC BY-NC-SA 3.0 中国大陆协议许可
本文链接:https://myxy99.cn/posts/golang/9e0030b.html