给定此结构
type A struct {
b *B
c string
d string
}
我想用reflect检查哪些字段在指针类型后面有一个结构,所以特别是我想创建一个只有在字段b
上迭代时才为true的条件。从我尝试使用反射文档的情况来看,我最终总是使用invalid Value
类型,这不允许我在后续的每个方法都会出现恐慌时走得更远。
package main
import (
"fmt"
"reflect"
)
type A struct {
b *B
c string
d string
}
type B struct {
}
func main() {
val := reflect.ValueOf(A{})
for i := 0; i < val.Type().NumField(); i++ {
if val.Field(i).Kind() == reflect.Ptr {
fmt.Println(reflect.Indirect(val.Field(i)).Kind())
}
fmt.Println(val.Field(i).Kind())
}
}
https://play.golang.org/p/oRry3ZubRxI
您得到的值无效,因为val.b
指针字段是nil
,并且您不能取消引用nil
指针。如果你想让你的代码工作,你必须用一个有效的指针初始化它:
val := reflect.ValueOf(A{b: &B{}})
有了这个改变,它就可以工作并输出(在Go Playground上试试(:
struct
ptr
string
如果你想让它在不初始化指针的情况下工作,那么你必须处理类型而不是值:
val := reflect.ValueOf(A{})
t := val.Type()
for i := 0; i < t.NumField(); i++ {
if ft := t.Field(i).Type; ft.Kind() == reflect.Ptr {
fmt.Println(ft.Elem().Kind())
}
fmt.Println(t.Field(i).Type.Kind())
}
这个输出是一样的,在Go Playground上试试这个。