当前位置: 首页 > 面试题库 >

在Go中遍历结构体的字段

施玉宸
2023-03-14
问题内容

基本上,(我知道)迭代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)

谢谢!


问题答案:

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)
}


 类似资料:
  • Go语言结构体数据类是将各个类型的变量定义的集合,通常用来表示记录。 package main import "fmt" // 这个person结构体有name和age成员 type person struct { name string age int } func main() { // 这个语法创建一个新结构体变量 fmt.Println(person{"B

  • 问题内容: 我需要遍历Firebase架构以获取每个的数据并在RecyclerView中显示它。现在,我无法使用侦听器遍历Firebase中的Schema,也无法通过名为的POJO类来获取它。 Firebase的JSON 侦听器代码 LOGCAT 03-28 08:52:53.966 23584-23584 / com.android.sam I / System.out:{-KDni3TN4NM

  • 问题内容: 我具有以下JSON结构: 如何使用JavaScript进行迭代? 问题答案: 取自jQuery docs:

  • 问题内容: 我具有以下JSON结构: 如何使用JavaScript进行迭代? 问题答案: 取自jQuery docs:

  • Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。 结构体表示一项记录,比如保存图书馆的书籍记录,每本书有以下属性: Title :标题 Author : 作者 Subject:学科 ID:书籍ID 定义结构体 结构体定义需要使用 type 和 struct 语句。struct 语句定义一个新的数据

  • 问题内容: package main 结构中无名字段的目的是什么? 是否可以像使用命名字段一样访问这些字段? 问题答案: 请参阅“ 在Go中嵌入 ”:您在结构中嵌入了一个匿名字段:通常与嵌入式结构一起使用,而不是像这样的基本类型。该类型没有要显示的“提升字段”。 字段或方法在一个结构匿名字段的被称为 促进 如果是一个合法的选择器,它表示字段或方法。 提升的字段的作用类似于结构的普通字段,只是它们不