如何列出指向golang结构域的所有字段的指针?

时间:2018-02-07 11:52:36

标签: go struct

golang是否有一种很好的方式来传递某些结构实例c的所有字段?

我正在寻找一些语法糖功能,所以不要这样做:

method(&c.field1, &c.field2, &c.field3, &c.field4, &c.field5, ...)

我可以这样做:

method(FieldsPointers(c)...)

我对golang很新,并且还在学习基础知识,如果没有好的方法可以做我想要的理由,我会很感激为什么会有这样的解释。

1 个答案:

答案 0 :(得分:2)

除了所有sql指定的工具外,如果要访问结构的指针,可以使用reflect。请注意,包裹很棘手,抢劫说这不适合所有人。

reflect.Value有方法NumField,它返回结构中的字段和Field(int),它接受​​字段的索引并返回字段本身。

但是当你想为它设置一个值时,它比调用这两个方法更复杂。让我用代码告诉你:

func Scan(x interface{}) {
    v := reflect.ValueOf(x).Elem()
    for i := 0; i < v.NumField(); i++ {
        switch f := v.Field(i); f.Kind() {
        case reflect.Int:
            nv := 37
            f.Set(reflect.ValueOf(nv))
        case reflect.Bool:
            nv := true
            f.Set(reflect.ValueOf(nv))
        }
    }
}

首先,您需要将结构的指针传递给Scan,因为您正在修改数据并且值必须是可设置的。这就是我们调用.Elem()来取消引用指针的原因。

其次,reflect.Value.Set必须使用相同的类型进行设置。您无法将uint32设置为int64,就像正常分配一样。

游乐场:https://play.golang.org/p/grvXAc1Px8g