登录
首页 >  Golang >  Go问答

使用反射调用结构体方法

来源:stackoverflow

时间:2024-02-25 21:27:23 409浏览 收藏

小伙伴们有没有觉得学习Golang很有意思?有意思就对了!今天就给大家带来《使用反射调用结构体方法》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你!

问题内容

我在调用递归反射函数中的方法时遇到问题。这是:

func setpropertiesfromflags(v reflect.value, viper *viper.viper) {
    t := v.type()
    method := v.methodbyname("parse")
    fmt.println(method)
    for i := 0; i < t.numfield(); i++ {
        field := t.field(i)
        switch field.type.kind() {
        case reflect.struct:
            setpropertiesfromflags(v.field(i), viper)
        case reflect.string:
            v.field(i).setstring(viper.getstring(field.tag.get("name")))
    }
}

我正在调用该函数:

// Config struct passed to all services
type Config struct {
    common.Config
    common.ServerConfig
    common.AuthConfig
}
// Parse the thing already!
func (c *Config) Parse() {
    fmt.Println("RUN THIS THING")
}
int main() {
   setPropertiesFromFlags(reflect.ValueOf(c).Elem(), viper)
}

我希望的是在我打印方法的地方获取我的解析方法并对其运行 .call() 。相反,它打印出: 我无法反对。

我想我很难理解每个方法的返回值。我知道我必须使用 valueof 来提取值,但似乎我尝试的任何排列都是从反射类本身获取方法:-p sigh


解决方案


问题在于该方法位于指针接收器上,但该函数正在使用赋值器接收器。 重写该函数以使用指向结构的指针:

func setpropertiesfromflags(vp reflect.value, viper *viper.viper) {
    method := vp.methodbyname("parse")
    fmt.println(method)

    v := vp.elem()
    t := v.type()
    for i := 0; i < t.numfield(); i++ {
        field := t.field(i)
        switch field.type.kind() {
        case reflect.struct:
            setpropertiesfromflags(v.field(i).addr(), viper) // <-- take address of field here
        case reflect.string:
            v.field(i).setstring(viper.getstring(field.tag.get("name")))
        }
    }
}

这样调用:

setPropertiesFromFlags(reflect.ValueOf(c), viper) // <-- do not call Elem()

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

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