2016-09-22 117 views
-2

数组我有一个接口,一个这样的数组:转储的接口在golang

type Test struct { 
    Name string 
} 

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

我如何可以转储这个阵列中,并使这样的字符串:


名称

ahmad

reza


我想要的东西像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 
+1

你有一个'Test'对象的数组,你真的需要把这些项目当作一些接口吗?在你的例子中,它当然不是必要的,但它只是一个例子,所以一些澄清会有帮助。如果这确实代表了你的代码,你应该100%做'result [i] .Name'而不是触及反射或接口。 – evanmcdonnal

+0

@evanmcdonnal测试对象仅用于示例。我不知道将传递给dump函数的接口是什么。 – ahmdrz

回答

0

你的例子真的可以使用更多的细节,但这里是在关闭您可以根据您提供什么帮助我的最好的尝试。我假设dump的定义如下:

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后面跟着它的值ect,那么你的代码看起来会与你不相同包括标题或一个接一个地在当前实例上打印每个字段)。但是这些是你必须担心自己的细节,或者在你的问题的更新中指定。关于这个话题的一些很好的阅读; https://blog.golang.org/laws-of-reflection

此外反射包文档是相当有帮助的。

+0

阅读有关问题的更新说明。如果我知道什么接口将通过转储非常简单。我不知道任何关于接口的功能。 – ahmdrz

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

感谢。

+0

https://github.com/ahmdrz/godumper – ahmdrz