Как сделать так, чтобы не генерировался структурный тег `json:"omitempty"`
Я использую Go Ent для ORM на своем сервере Go.
Проблема в том, что всякий раз, когда я генерирую коды по специальной схеме, все поля создаются с тегом.
Например, это мойent/schema/user.go
.
type User struct {
ent.Schema
}
// Fields of the Account.
func (User) Fields() []ent.Field {
return []ent.Field{
field.String("name").
MaxLen(63).
Unique(),
field.Int32("money"),
}
}
После того, как я запускаю командуgo generate ./ent
, это делаетent/user.go
.
type User struct {
config `json:"-"`
// ID of the ent.
ID int `json:"id,omitempty"`
// Name holds the value of the "name" field.
Name string `json:"name,omitempty"`
// Money holds the value of the "money" field.
Money int32 `json:"money,omitempty"`
}
я использую это*ent.User
введите в качестве тела ответа HTTP, ноMoney
поле имеет тег, поэтому нетmoney
json, если у пользователя нет денег.
Я знаю, что заменаomitempty
тег можно сделать с помощью следующего кода, но я хочу заменить этот тег для всех полей, которые я определяю сразу.
type User struct {
ent.Schema
}
// Fields of the Account.
func (User) Fields() []ent.Field {
return []ent.Field{
field.String("name").
MaxLen(63).
Unique(),
field.Int32("money").
StructTag("json:\"money\""),
}
}
1 ответ
Вы можете перебирать поля и изменять дескриптор:
func (User) Fields() []ent.Field {
fields := []ent.Field{
field.String("name").
MaxLen(63).
Unique(),
field.Int32("money"),
}
for _, f := range fields {
f.Descriptor().Tag = `json:"` + f.Descriptor().Name + `"`
}
return f
}
Или
func TrimOmitEmptyTag(fields []ent.Field) {
for _, f := range fields {
if f.Descriptor().Tag == "" {
f.Descriptor().Tag = `json:"` + f.Descriptor().Name + `"`
}
}
}
func (User) Fields() []ent.Field {
return TrimOmitEmptyTag([]ent.Field{
field.String("name").
MaxLen(63).
Unique(),
field.Int32("money").
StructTag("json:\"money\""),
})
}