问题描述
proto
文件自动生成.pb.go
文件的代码中tag上会自动加上omitempty
字段,如下:
type RoleUser struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id" bson:"id" form:"id"`
RoleId string `protobuf:"bytes,2,opt,name=role_id,json=roleId,proto3" json:"role_id" bson:"role_id" form:"role_id"`
UserId string `protobuf:"bytes,3,opt,name=user_id,json=userId,proto3" json:"user_id" bson:"user_id" form:"user_id"`
Type RoleUserType `protobuf:"varint,4,opt,name=type,proto3,enum=roleUser.RoleUserType" json:"type" bson:"type" form:"type"`
StartedAt int64 `protobuf:"varint,6,opt,name=started_at,json=startedAt,proto3" json:"started_at" bson:"started_at" form:"started_at"`
ExpiredAt int64 `protobuf:"varint,7,opt,name=expired_at,json=expiredAt,proto3" json:"expired_at" bson:"expired_at" form:"expired_at"`
CreatedAt int64 `protobuf:"varint,100,opt,name=created_at,json=createdAt,proto3" json:"created_at" bson:"created_at" form:"created_at"`
UpdatedAt int64 `protobuf:"varint,101,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at" bson:"updated_at" form:"updated_at"`
DeletedAt int64 `protobuf:"varint,102,opt,name=deleted_at,json=deletedAt,proto3" json:"deleted_at" bson:"deleted_at" form:"deleted_at"`
}
这个字段会导致一个问题是:带有omitempty
tag的成员,如果该字段为零值
,则在序列化为JSON后不会带有该字段,如果前端需要显示零值,则会找不到字段而报错。
处理方法
同样用go写个简单脚本,批量删除该tag:
//remove_tag_test.go
package pb
import (
"fmt"
"io/ioutil"
"strings"
"testing"
)
const filename = "./roleUser.pb.go"
func TestRemoveTag(t *testing.T) {
fileData, err := ioutil.ReadFile(filename)
if err != nil {
fmt.Printf("ReadFile err: %v\n", err)
return
}
data := strings.ReplaceAll(string(fileData), ",omitempty", "")
fileData = []byte(data)
err = ioutil.WriteFile(filename, fileData, 0644)
if err != nil {
fmt.Printf("WriteFile err: %v\n", err)
return
}
fmt.Println("TestRemoveTag successfully")
}