我希望有一个通用的方法,它总是返回struct值,无论它是作为指针,切片还是数组提供.
我对此的看法是:
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
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的问题,在得到该结构出的规定slice或array.
如何扩展上面的函数以从数组或切片中获取struct值?
更新:我想要做的是[]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
}
Run Code Online (Sandbox Code Playgroud)
关于Type.Elem(),来自http://golang.org/pkg/reflect/#Type:
// Elem返回一个类型的元素类型.
//如果类型的种类不是数组,Chan,Map,Ptr或Slice,则会发生混乱.
// 编辑更新了函数以处理一片指针.
| 归档时间: |
|
| 查看次数: |
637 次 |
| 最近记录: |