一尘不染

在 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).

谢谢!


阅读 201

收藏
2021-11-11

共1个答案

一尘不染

reflect.Value通过使用检索字段的 后,Field(i)您可以通过调用Interface(). 所述接口值则代表该字段的值。

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

您可以在 go 中实现的最接近的是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)
}
2021-11-11