转储golang

时间:2016-09-22 21:51:58

标签: arrays go reflection dump

我有一个像这样的接口数组:

type Test struct {
    Name string
}

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

如何转储此数组并生成如下字符串:

名称

艾哈迈德

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

更新

我不想转储测试界面...

我想转储每个接口。

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

2 个答案:

答案 0 :(得分:0)

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

 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

反射包文档也非常有用。

答案 1 :(得分:0)

我找到了办法!

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 {
                v := reflect.Indirect(item)
                for j := 0; j < v.NumField(); j++ {
                    fmt.Println(v.Type().Field(j).Name, v.Field(j).Interface())
                }
            }
        }
    }
}

https://play.golang.org/p/JUAnVoSAwc

感谢。