Function 如何正确使用。调用反射包
我的代码有最后一个问题,涉及reflect包中的.Call函数 所以我打了一个这样的电话:Function 如何正确使用。调用反射包,function,go,reflection,parameters,go-reflect,Function,Go,Reflection,Parameters,Go Reflect,我的代码有最后一个问题,涉及reflect包中的.Call函数 所以我打了一个这样的电话: params := "some map[string][]string" in := make([]reflect.Value,0) return_values := reflect.ValueOf(&controller_ref).MethodByName(action_name).Call(in) 其中,我调用的方法如下所示: func (c *Controller) Root(params
params := "some map[string][]string"
in := make([]reflect.Value,0)
return_values := reflect.ValueOf(&controller_ref).MethodByName(action_name).Call(in)
其中,我调用的方法如下所示:
func (c *Controller) Root(params map[string][]string) map[string] string{}
我不太明白的是如何操作“in”变量,以便将需要的映射正确地传递到函数中。我看到make()中的第二个参数是参数的长度?但我不太明白如何格式化变量,以便正确地传入我的参数。我递归地遇到错误消息:
reflect: Call with too few input arguments
任何帮助都将不胜感激 调用试图将零参数传递给需要一个参数的控制器(中的
为空切片)。您需要在:=[]reflect.Value{reflect.ValueOf(params)}
中执行类似的操作
找到方法后,还可以调用.Interface()
,然后使用类型断言获取func
,您可以直接调用:
// get a reflect.Value for the method
methodVal := reflect.ValueOf(&controller_ref).MethodByName(action_name)
// turn that into an interface{}
methodIface := methodVal.Interface()
// turn that into a function that has the expected signature
method := methodIface.(func(map[string][]string) map[string]string)
// call the method directly
res := method(params)
(然后,您甚至可以将方法
缓存在由方法名称键入的映射中,这样您就不必在下一次调用时执行反射
操作。但您不必这样做,它才能工作。)来自:
Call使用中的输入参数调用函数v
。例如,如果len(in)==3
,v.Call(in)
表示Go Callv(在[0]、[1]、[2])
因此,如果要使用一个参数调用函数,中的必须包含
右键输入,在您的示例中为map[string][]string
表情
in := make([]reflect.Value,0)
创建长度为0的切片。将此消息传递给Value.Call
将导致您在调用时收到的恐慌
需要1个参数,而不是零
正确的做法是:
m := map[string][]string{"foo": []string{"bar"}}
in := []reflect.Value{reflect.ValueOf(m)}
myMethod.Call(in)
我不明白你的最后一段。对不起。添加了代码。我的意思是,一旦你找到了这个方法,得到一个接口{}
,然后用一个类型断言来完成其余的工作。(@nemo--这能澄清我说的吗?即使你可能认为这不是一个好主意?+1,现在对我来说有意义:)这不是一个坏主意,但是,您需要在编译时知道类型,这并不总是可能的。非常感谢您的回答。帮助我解决自己的问题:啊,好的,好的,我明白了,非常感谢!)感谢你今天的帮助!