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

时间:2015-08-10 16:03:47

标签: reflection go

我有一个功能

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

...

其中需要一些结构并尝试获取v的字段, 但是如果v为空,那么" val.Index(0)"崩溃程序。有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

如果你有一个切片,你需要首先检查,然后检查你是否有一个空切片,你可能应该检查你是否有一个结构:example

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())
...

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

// 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)
}