
[英]Using reflection to iterate over struct's struct members and calling a method on it
[英]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.