小编典典

在Go中遍历结构体的字段

go

基本上,(我知道)迭代a的字段值的唯一方法struct是这样的:

type Example struct {
    a_number uint32
    a_string string
}

//...

r := &Example{(2 << 31) - 1, "...."}:
for _, d:= range []interface{}{ r.a_number, r.a_string, } {
  //do something with the d
}

我想知道,是否有更好,更通用的实现方法[]interface{}{ r.a_number, r.a_string, },所以我不需要单独列出每个参数,或者有没有更好的方法遍历结构?

我试图浏览一下reflect包装,但是碰到了墙,因为我不确定一旦取回该怎么办reflect.ValueOf(*r).Field(0)

谢谢!


阅读 3057

收藏
2020-07-02

共1个答案

小编典典

reflect.Value使用检索字段的后,Field(i)您可以通过调用从中获取接口值Interface()。然后,所述接口值表示字段的值。

您可能知道,没有函数可以将字段的值转换为具体类型,因为您可能没有泛型。因此,不存在与签名没有功能GetValue() T
T被该字段(其改变,当然,这取决于字段)的类型。

您可以随时获得最接近的结果,GetValue() interface{}而这正是所reflect.Value.Interface() 提供的。

以下代码说明了如何使用反射(play)获取结构中每个导出字段的值:

import (
    "fmt"
    "reflect"
)

func main() {
    x := struct{Foo string; Bar int }{"foo", 2}

    v := reflect.ValueOf(x)

    values := make([]interface{}, v.NumField())

    for i := 0; i < v.NumField(); i++ {
        values[i] = v.Field(i).Interface()
    }

    fmt.Println(values)
}
2020-07-02