Function 如何正确使用。调用反射包

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

我的代码有最后一个问题,涉及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 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 Call
v(在[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,现在对我来说有意义:)这不是一个坏主意,但是,您需要在编译时知道类型,这并不总是可能的。非常感谢您的回答。帮助我解决自己的问题:啊,好的,好的,我明白了,非常感谢!)感谢你今天的帮助!