问题在于该方法在指针接收器上,但是该函数正在与赋值器接收器一起使用。重写该函数以使用指向结构的指针:
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()



