arrays - 在golang中转储接口(interface)数组

标签 arrays go reflection dump

我有一组这样的接口(interface):

type Test struct {
    Name string
}

func main() {
    result := []Test{
        Test{Name: "ahmad"},
        Test{Name: "reza"},
    }
    dump(result)
}

我如何转储这个数组并生成这样的字符串:


名字

艾哈迈德

礼拜


我想要类似 this 的东西但使用数组。

更新

我不想转储测试接口(interface)...

我想转储所有接口(interface)。

package main

import (
    "fmt"
    "reflect"
)

type Test struct {
    Name string
}

func main() {
    result := []Test{
        Test{Name: "ahmad"},
        Test{Name: "reza"},
    }
    dump(result)
}

func dump(datasets interface{}) {
    items := reflect.ValueOf(datasets)
    if items.Kind() == reflect.Slice {
        for i := 0; i < items.Len(); i++ {
            item := items.Index(i)
            if item.Kind() == reflect.Struct {
                s := reflect.ValueOf(item)
                t := reflect.TypeOf(item)
                for j := 0; j < s.NumField(); j++ {
                    fmt.Println(t.Field(j).Name)
                }
            }
        }
    }
}

是这样的。但结果是:

typ
ptr
flag
typ
ptr
flag

如何将输出更改为:

Name
Name

最佳答案

您的示例确实可以使用更多详细信息,但这是我根据您提供的内容为您提供帮助的最佳尝试。我假设转储的定义如下;

 func dump(items []interface{})

而且您特别希望打印 Name在传入的任何内容上打印字段,而不是说在传入的任何对象上打印所有字段。

func dump(items []interface{}) {
    fmt.Println("Name")
    for i := 0; i < len(items); i++ {
          v := reflect.ValueOf(items[i])
          name := v.FieldByName("Name")
          fmt.Println(name.String())
    }
}

工作示例在这里; https://play.golang.org/p/zUBt6qkuok

如果您想要打印所有可以通过微小更改完成的字段。只需在其中迭代 j < v.NumField() 的地方添加另一个循环即可并使用 v.Field(i)获取那里的每个字段。有很多方法可以根据您的需要在此级别构建代码(例如,如果您想打印 FieldName1 后跟它的值,然后 FieldName2 后跟它的值等等,那么您的代码看起来会与您不打印时完全不同包括标题或在当前实例上一个接一个地打印每个字段)。但这些是您必须担心自己或在问题更新中指定的细节。这里有一些关于这个主题的好读物; https://blog.golang.org/laws-of-reflection

反射包文档也很有帮助。

关于arrays - 在golang中转储接口(interface)数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39649446/

相关文章:

go - 最小 Go OpenGL 程序段错误

struct 中的 Golang channel 表现不同,在创建 struct 时传递它,在创建后通过函数传递

c# - 在所有程序集中查找类型

python - Pymongo如何更新数组中行的特定值

python - numpy 数组循环中的索引顺序

arrays - 计算向量中小于另一个向量中每个元素的值

c# - 有没有好的方法来获取当前的属性名称?

ios - 如何使用循环访问对象数组的每个属性?

go - 如何制作接受字符串参数的函数,并根据它返回不同的结构类型?

java - 如何获取对股票启动器 Activity 对象的引用?