Как опустить некоторые параметры структуры 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"
}
Это должно позволить вам отфильтровать поля, которые вы хотите использовать.