【问题标题】:Check if underlying type is a struct with reflect检查底层类型是否是具有反射的结构
【发布时间】:2020-03-07 22:27:34
【问题描述】:

给定这个结构

type A struct {
  b *B
  c string
  d string
}

我想用反射检查哪些字段在指针类型后面有一个结构,所以特别是我想创建一个只有在遍历字段b 时才会成立的条件。根据我使用反射文档的尝试,我总是以 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

【问题讨论】:

    标签: pointers go struct reflection


    【解决方案1】:

    您得到无效值,因为val.b 指针字段是nil,您不能取消引用nil 指针。如果你想让你的代码工作,你必须用一个有效的指针来初始化它:

    val := reflect.ValueOf(A{b: &B{}})
    

    通过此更改,它可以工作并输出(在Go Playground 上尝试):

    struct
    ptr
    string
    

    如果您希望它在不必初始化指针的情况下工作,那么您必须处理 types 而不是 values

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-25
      • 1970-01-01
      • 2022-12-23
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      • 2017-01-13
      相关资源
      最近更新 更多