当前位置: 首页 > 面试题库 >

反射:在ptr值上调用reflect.Value.FieldByName

龙弘济
2023-03-14
问题内容

我有一个像这个演示这样的数据结构。

type Family struct {
   first string
   last string
}
type Person struct {
   name string
   family *Family
}

func main(){
   per1 := Person{name:"niki",family:&Familys{first:"yam",last:"bari"}}
   Check(per1)
}

和代码:

var validate *validator.Validate
func Check(data interface{}) {
    var v = reflect.ValueOf(data)

    if v.Kind() == reflect.Struct {
        fmt.Println("was a struct")
        v = v.FieldByName("family").FieldByName("last")
        fmt.Println(v)
    }
}

当我不为家庭使用Point时,它会返回“ bari”并且没关系。但是有了point,就会出现此错误。

反射:在ptr值上调用reflect.Value.FieldByName

我进行了很多搜索,但找不到答案可以提供帮助。


问题答案:

您已经注意到,family*Family。正如错误所言,您不能在该值是指针.FieldByName(...)reflect.Value地方调用。

相反,您需要间接指针,以获取其指向的值,然后对其进行调用.FieldByName(...)

familyPtr := v.FieldByName("family")
v = reflect.Indirect(familyPtr).FieldByName("last")

请参阅有关间接文档:https://golang.org/pkg/reflect/#Indirect



 类似资料:
  • 问题内容: 我在递归反射函数中调用方法时遇到麻烦。这里是: 我用以下函数调用该函数: 我希望获得的解析方法在我正在打印方法的地方,并针对它运行.Call()。相反,它是打印出来的:我不能反对。 我想我无法将每个方法的返回值都放在头上。我知道我必须使用ValueOf来提取值,但似乎我尝试了任何置换,都是从反射类本身获取方法的:-p 感叹 问题答案: 问题在于该方法在指针接收器上,但是该函数正在与赋值

  • 如果反射值对象(reflect.Value)中值的类型为函数时,可以通过 reflect.Value 调用该函数。使用反射调用函数时,需要将参数使用反射值对象的切片 []reflect.Value 构造后传入 Call() 方法中,调用完成时,函数的返回值通过 []reflect.Value 返回。 下面的代码声明一个加法函数,传入两个整型值,返回两个整型值的和。将函数保存到反射值对象(refle

  • 问题内容: 如何使用反射调用带有参数的方法? 我想指定这些参数的值。 问题答案: 这是一个使用涉及原语的反射调用方法的简单示例。 要健壮,应该捕获和处理所有检查反射有关的异常,,。

  • 问题内容: 我需要使用反射调用类的setter方法,并且代码如下: 的是一个以及设置器方法如下: 运行此代码时,将引发A ,但是将setter方法参数类型更改为from时,将执行正常。有没有一种方法可以将setter方法的参数保持为超级类型,并且在从类中获取方法时仍无需手动指定参数的类型即可使用反射? 问题答案: 与其他答案相反,有一个非常简单的解决方案。请参阅。它为您提供了一种执行任意反射代码的

  • 问题内容: 我正在与一个非开源项目合作,我需要修改一个或多个其类。 在一个类中是以下集合: 我需要做的就是在这里使用反射和并发hashmap。我试过下面的代码,但是不起作用。 问题答案: 希望这是您要尝试做的事情: 它打印: