如何省略杜松子酒结构的一些参数

时间:2019-03-18 09:06:53

标签: go struct reflection gin gin-gonic

我有超过50个参数的大型结构

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

我使用gin-gonic,当我返回application时,我需要省略一些参数,我创建了一个函数,该函数将一些参数(playLink)设为空,然后gin返回了正确的json(不包含)不必要的值)。我听说反射不是快速操作,因此在我们的情况下,我们可以使用很多难看的if-else或switch-cases。还有其他解决方案比反射更快,比if-elses更漂亮吗?

问题是结构参数具有非空值,因此不会被gin省略。这就是为什么我创建函数以使一些参数在返回之前为空

2 个答案:

答案 0 :(得分:3)

问题是,如果您只想将几个字段清零,那么在不使用函数的情况下(例如,

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 Playground上尝试。

答案 1 :(得分:0)

如果我理解正确:您想从结构体中返回一些值,但不是全部?也许是嵌套结构?

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

这应该使您可以过滤出要使用的字段。