【问题标题】:How to specify the field we wanna use from a struct?如何从结构中指定我们想要使用的字段?
【发布时间】:2018-11-23 14:25:32
【问题描述】:

我有一个由多个相同类型的字段组成的结构。

type test struct{
       A int
       B int
       C int
}

我想对三个字段应用一个功能,但我只想每次都做一个。

function something (toto test, cond int) {
    if (cond == 1){
        // then we will use A for the rest of the function
    }else if (cond == 2) {
        // then we use B etc....
    } ... 

    for mail, v := range bdd {
        if _, ok := someMap[v.A]; !ok {       // use v.A or V.B or V.C     
            delete(bdd, mail)
        }
        ...
    }

    ...
}

这个函数真的很长,我很烦我把代码复制了 3 次,只是为了改变一行。 我尝试了反射包。我认为这样做很危险。

【问题讨论】:

  • 您确定应该将该信息存储为结构字段吗?也许地图会更合适。
  • @TimCooper 实际上我正在使用类似 map[email]test 的东西,所以测试包含与该电子邮件相关的信息,实际上我有超过 3 个字段为每个字段制作一张地图有点太多了,而且我认为不实用
  • 如果您不想使用反射,您可以使函数可变参数获取指向字段的指针。例如something(&t.A, &t.B, &t.C)

标签: go struct field reflect


【解决方案1】:

在您的情况下,我会使用 map 而不是 struct,但如果确实需要 struct,您可以使用反射包。

v := reflect.ValueOf(x)

for i := 0; i < v.NumField(); i++ {
    fmt.Printf("%v", v.Field(i).Interface())
}

【讨论】:

  • 是的,这就是我试图做的,但后来我意识到在 for 循环中,我们必须为每次迭代调用反射。我想在函数的开头设置一次我想使用的字段。
猜你喜欢
  • 2021-02-25
  • 1970-01-01
  • 2018-08-27
  • 2020-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-24
  • 2019-02-20
相关资源
最近更新 更多