我有一组这样的接口(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/