登录
首页 >  Golang >  Go问答

Golang反射MethodByName()

来源:stackoverflow

时间:2024-04-29 16:00:32 260浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《Golang反射MethodByName()》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下,希望所有认真读完的童鞋们,都有实质性的提高。

问题内容

我编写了根据数据结构的类型填充数据结构的代码。我需要调用嵌套结构函数(如果存在)。

为什么在字段正确的情况下查找函数时得到的值为零?

type (

    SomeData struct {
        Val NestedType
    }

    NestedType struct {
        V1 string
    }
)

func (t *NestedType) FillData(v int) {
    t.V1 = fmt.Sprintf("Here is %v", v)
}

func main() {

    i := SomeData{}

    reflect.ValueOf(&i.Val).MethodByName("FillData").Call([]reflect.Value{reflect.ValueOf(555)})
    fmt.Println(i) /// {{I hate 555}}


    // BUT!

    v := 666

    newObj := reflect.New(reflect.TypeOf(SomeData{}))

    fVal := newObj.Elem().FieldByName("Val")
    fmt.Println( "fVal.NumField():", fVal.NumField()) //fVal.NumField(): 1


    f := fVal.MethodByName("FillData")
    f.Call([]reflect.Value{reflect.ValueOf(v)}) //panic: reflect: call of reflect.Value.Call on zero Value


}

解决方案


该方法位于指针接收器上。值 fvalnestedtype。拨打Value.Addr获取*nestedtype

f := fVal.Addr().MethodByName("FillData")

Run it on the playground

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

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