繁体   English   中英

使用反射调用结构方法

[英]Calling struct method with reflection

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

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

我打电话给 function:

// 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()。 相反,它打印出: <invalid reflect.Value>我不能反对。

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

问题是该方法是在指针接收器上,但 function 正在使用估值器接收器。 重写 function 以使用指向结构的指针:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM