登录
首页 >  Golang >  Go问答

reflect: 在 ptr Value 上调用 reflect.Value.FieldByName

来源:Golang技术栈

时间:2023-04-12 16:16:44 428浏览 收藏

偷偷努力,悄无声息地变强,然后惊艳所有人!哈哈,小伙伴们又来学习啦~今天我将给大家介绍《reflect: 在 ptr Value 上调用 reflect.Value.FieldByName》,这篇文章主要会讲到golang等等知识点,不知道大家对其都有多少了解,下面我们就一起来看一吧!当然,非常希望大家能多多评论,给出合理的建议,我们一起学习,一起进步!

问题内容

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

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)
    }
}

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

reflect: 在 ptr Value 上调用 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

到这里,我们也就讲完了《reflect: 在 ptr Value 上调用 reflect.Value.FieldByName》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于golang的知识点!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表