在使用 protoc-gen-go
生成代码的时候,我们在json tag是一个困扰项,因为它不支持设置json tag,这会比较麻烦。比如如下定义
message BaseField {
string errMsg = 1;
int64 errCode = 2;
}
最终会生成
type BaseField struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
ErrMsg string `protobuf:"bytes,1,opt,name=errMsg,proto3" json:"errMsg,omitempty"`
ErrCode int64 `protobuf:"varint,2,opt,name=errCode,proto3" json:"errCode,omitempty"`
}
默认就是跟 message 定义的一样,且带了 omitempty
,这会使返回的结果难以预测,因为omitempty
会删掉默认值的字段,比如
BaseField {
ErrMsg: "",
ErrCode: 500,
}
最终 json encode 之后是 {errCode: 500}
,这个很不好。
当然,protobuf是提供了json_name选项,效果是
message BaseField {
string errMsg = 1 [json_name = "err_msg"];
int64 errCode = 2 [json_name = "err_code"];
}
type BaseField struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
ErrMsg string `protobuf:"bytes,1,opt,name=errMsg,json=err_msg,proto3" json:"errMsg,omitempty"`
ErrCode int64 `protobuf:"varint,2,opt,name=errCode,json=err_code,proto3" json:"errCode,omitempty"`
}
很明显它只是改变了 protobof
里面的 json,而不是外面的。
那么该怎么解决呢,我们可以使用包 github.com/favadi/protoc-go-inject-tag
来解决这个问题,其实就是能够替换掉 json tag 就行。
go install github.com/favadi/protoc-go-inject-tag@latest
message BaseField {
// @inject_tag: json:"err_msg"
string errMsg = 1;
// @inject_tag: json:"err_code"
int64 errCode = 2;
}
执行如下命令
protoc read6.proto --go_out=. --go-grpc_out=.
protoc-go-inject-tag -input=read6/read6.pb.go
最终生成
type BaseField struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// @inject_tag: json:"err_msg"
ErrMsg string `protobuf:"bytes,1,opt,name=errMsg,proto3" json:"err_msg"`
// @inject_tag: json:"err_code"
ErrCode int64 `protobuf:"varint,2,opt,name=errCode,proto3" json:"err_code"`
}