我想有一个通用的方法,无论它是作为指针,切片还是数组提供的,都将始终返回结构值。
我对此的处理方式如下:
func main() { p := Person{} if value(p).Kind() != reflect.Struct { fmt.Printf("Error 1") } if value(&p).Kind() != reflect.Struct { fmt.Printf("Error 2") } if value([]Person{p}).Kind() != reflect.Struct { fmt.Printf("Error 3") } if value(&[]Person{p}).Kind() != reflect.Struct { fmt.Printf("Error 4") } } func value(m interface{}) reflect.Value { v := reflect.ValueOf(m) switch v.Kind() { case reflect.Ptr: v = v.Elem() fallthrough case reflect.Slice, reflect.Array: v = v.Elem() } return v }
去游乐场
如您所见,问题出在从a slice或array。中获取结构。
slice
array
我如何扩展上面的函数以从数组或切片中获取struct的值?
更新:我要做的就是将[]People变成People。
[]People
People
如果你只是想要的类型,即使片是零,你可以使用像这样:
func value(m interface{}) reflect.Type { t := reflect.Indirect(reflect.ValueOf(m)).Type() if t.Kind() == reflect.Slice || t.Kind() == reflect.Array { t = t.Elem() if t.Kind() == reflect.Ptr { t = t.Elem() } return t } return t }
关于Type.Elem(),来自http://golang.org/pkg/reflect/#Type:
Type.Elem()
// Elem返回类型的元素类型。 //如果类型的Kind不是Array,Chan,Map,Ptr或Slice,则会出现恐慌。
// Elem返回类型的元素类型。
//如果类型的Kind不是Array,Chan,Map,Ptr或Slice,则会出现恐慌。
// 编辑 更新了该函数,使其也适用于切片指针。