检查基础类型是否是具有反射的结构



给定此结构

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上试试这个。

最新更新