【问题标题】:How to omit some parameters of structure Gin gonic如何省略结构 Gin gonic 的一些参数
【发布时间】:2019-03-18 09:06:53
【问题描述】:

我的结构很大,参数超过 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-else 更漂亮的解决方案?

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

【问题讨论】:

  • 不清楚你想要什么。您想从 JSON 输出中省略字段吗? ,omitempty 选项已经做到了。
  • @icza 请检查 UPD
  • 您要省略的字段是否始终相同?说在您的示例中,您是否总是需要从Application 的json 中省略两个字段"FullName", "ActualAddress"?还是需要在某些情况下保留它们,而在其他情况下省略其他字段?
  • @mkopriva 不一样,在另一种情况下省略一组参数
  • 如果您的目标只是在 JSON 中省略这些值,请将这些字段的 json 标记设置为 -

标签: go struct reflection go-gin


【解决方案1】:

问题是,如果您只想将几个字段归零,那么在没有函数的情况下执行此操作更具可读性,例如

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 上试用。

【讨论】:

  • 省略FullName,ActualAddress只是一个例子,如果我们每次都有不同的组合呢?结构大,组合可上千种
  • @mondayguy 请阅读完整答案。我建议zeroFields() 接受指针。
  • 问题是我们的系统中有角色,我需要为每个角色省略一些参数...省略了存储在数据库中的参数并且可以不同...现在更清楚了吗?抱歉英语不好
  • 我的意思是我们必须用一些省略字段名的字符串数组调用 zeroFilelds 函数,因为它可以是数千种组合
  • 是的,您可以这样做。您可以将切片传递给可变参数函数。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2013-07-02
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 2016-05-06
    • 2019-03-14
    • 2015-09-04
    相关资源
    最近更新 更多