我有超过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省略。这就是为什么我创建函数以使一些参数在返回之前为空
答案 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"
}
这应该使您可以过滤出要使用的字段。