我想有一个通用的方法,无论它是作为指针, slice 还是数组提供的,都将始终返回结构值。
我对此的处理方式如下:
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
}
Go Playground
如您所见,问题在于从
slice
或array
中获取结构。我如何扩展上面的函数以从数组或 slice 中获取struct的值?
更新:我要做的是将
[]People
变成People
。 最佳答案
如果即使分片为nil也只想输入类型,则可以使用this之类的东西:
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://编辑更新了该功能,使其也适用于 slice 指针。
关于reflection - 指针,数组和 slice 的结构值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25102827/