Как сделать так, чтобы не генерировался структурный тег `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поле имеет тег, поэтому нетmoneyjson, если у пользователя нет денег.

Я знаю, что замена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\""),
    })
}
Другие вопросы по тегам