gpt4 book ai didi

go - 用反射调用struct方法

转载 作者:行者123 更新时间:2023-12-01 22:08:53 24 4
gpt4 key购买 nike

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

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感叹

最佳答案

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

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

关于go - 用反射调用struct方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58736651/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com