通过反射调用struct方法

我在递归反射函数中调用方法时遇到麻烦。在这里:

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

我希望的是将我的parse方法放到我正在打印方法的地方,然后对它运行.Call()。相反,它正在打印出:<invalid reflect.Value>,我无法反对。

我想我无法将每个方法的返回值都放在头上。我知道我必须使用ValueOf来提取值,但是似乎我尝试从反射类本身获取方法的任何排列:-p sigh

dwzjr 回答:通过反射调用struct方法

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

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()
本文链接:https://www.f2er.com/3149683.html

大家都在问