Reflection 获取Go中空结构切片的字段

Reflection 获取Go中空结构切片的字段,reflection,go,Reflection,Go,我有一个函数 func (r *render) foo(v interface{}) { val := reflect.ValueOf(v) fields := structs.Fields(val.Index(0).Interface()) ... 它获取一个结构切片并尝试获取v的字段, 但是,如果v为空,则val.Index0会使程序崩溃。有更好的方法吗?您需要首先检查是否有一个切片开始,然后检查是否有一个空切片,并且您可能应该在执行此操作时检查是否也有一个结构: 如果只

我有一个函数

func (r *render) foo(v interface{}) {
    val := reflect.ValueOf(v)
    fields := structs.Fields(val.Index(0).Interface())

...
它获取一个结构切片并尝试获取v的字段,
但是,如果v为空,则val.Index0会使程序崩溃。有更好的方法吗?

您需要首先检查是否有一个切片开始,然后检查是否有一个空切片,并且您可能应该在执行此操作时检查是否也有一个结构:

如果只需要结构类型中的字段,无论切片是否为空,都可以使用切片类型的Elem方法来提取它


我知道它永远都是一片,要么是空的,要么不是。但是,我需要能够获取切片元素类型的字段。@tommy_p1ckles:你的问题是切片为空时发生崩溃,所以你需要确保它不是空的。你还有什么意思?对不起,我想我说得不好。我的函数需要一片结构,我需要能够得到结构的所有字段的名称,当结构是非空的时候这不是问题,因为代码字段:=structs.Fieldsval.Index0.Interface会这样做,但是如果片是空的,那么这种方法就不起作用了,因为没有第一个元素可以查看。@tommy\u p1ckles:OK,我懂了。我添加了如何从切片中获取类型。
val := reflect.ValueOf(v)
if val.Kind() != reflect.Slice {
    fmt.Println("not a slice")
    return
}

if val.Len() == 0 {
    fmt.Println("empty slice")
    return
}

if val.Index(0).Kind() != reflect.Struct {
    fmt.Println("not a slice of structs")
    return
}

fields := structs.Fields(val.Index(0).Interface())
...
// get the internal type of the slice
t := val.Type().Elem()
if t.Kind() != reflect.Struct {
    fmt.Println("not a struct")
    return
}

fmt.Println("Type:", t)
for i := 0; i < t.NumField(); i++ {
    fmt.Println(t.Field(i).Name)
}