【发布时间】:2014-08-03 22:43:30
【问题描述】:
我想要一个通用的方式,无论它是作为指针、切片还是数组提供,它总是返回结构值。
我对此的看法:
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
}
如您所见,问题在于将结构从slice 或array 中取出。
如何扩展上述函数以从数组或切片中获取结构值?
更新:我想做的是将[]People 变成People。
【问题讨论】:
-
您不能只将
[]People变成People,因为[]People可以包含许多People对象,并且(通常)没有合理的方法来合并对象。尝试只选择一个(第一个?)。还有如果切片是空的怎么办? -
我很确定他正在尝试获取结构字段。
标签: reflection go