Как опустить некоторые параметры структуры Gin Gonic

У меня большая структура с более чем 50 параметрами

type Application struct {
    Id                  int64   `json:"id"`
    FullName            string  `json:"fullName,omitempty"`
    ActualAddress       string  `json:"actualAddress,omitempty"`
.....
}

Я использую джин-гоник, и когда я вернусь application Мне нужно пропустить некоторые параметры. Я создал функцию, которая очищает некоторые параметры ( playLink), а затем gin возвращает мне правильный json (без ненужных значений). Я слышал, что рефлексия не является быстрой операцией, поэтому в нашем случае мы можем использовать много уродливых if-else или переключателей. Есть ли другие решения, более быстрые, чем отражающие, и более красивые, чем if-elses?

Дело в том, что структурные параметры имеют непустые значения, поэтому они не будут опущены джином. Вот почему я создал функцию, чтобы сделать некоторые параметры пустыми перед возвратом

2 ответа

Дело в том, что если вы хотите обнулить только несколько полей, это более читабельно, если вы делаете это без функции, например

app := Application{}

app.FullName, app.ActualAddress = "", ""

Если вы хотите создать для него функцию, хотя бы используйте переменный параметр, чтобы ее было проще вызвать:

func zeroFields(application *Application, fields ...string) {
    // ...
}

Итак, называя это:

zeroFields(&app, "FullName", "ActualAddress")

Да, для этого потребуется использовать отражение, поэтому оно медленнее, чем могло бы быть, и подвержено ошибкам (ошибочные имена могут быть обнаружены только во время выполнения). Если вы хотите избежать использования отражения, передайте адрес полей:

func zeroFields(ps ...*string) {
    for _, p := range ps {
        *p = ""
    }
}

Таким образом, у вас есть гарантия времени компиляции, что вы правильно вводите имена полей и что они имеют string тип.

Называя это:

zeroFields(&application.FullName, &application.ActualAddress)

Попробуйте это на игровой площадке Go.

Если я правильно понимаю: вы хотите вернуть некоторые значения из вашей структуры, но не все из них? Возможно, вложенная структура?

type Application struct {
  ID struct {
    ID int64 `json:"id"`
  } `json:"id"`
  Person struct {
    Fullname string `json:"Fullname"
  } `json:"person"
}

Это должно позволить вам отфильтровать поля, которые вы хотите использовать.

Другие вопросы по тегам