Как опустить некоторые параметры структуры Gin Gonic - PullRequest
1 голос
/ 18 марта 2019

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 18 марта 2019

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

app := Application{}

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

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

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 .

0 голосов
/ 18 марта 2019

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

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

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

...