function - 如何在 reflect 包中正确使用 .Call

标签 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)

我调用 .Call 的方法如下:

func (c *Controller) Root(params map[string][]string) map[string] string{}

我不太明白的是如何操作“in”变量以便将我需要的映射正确传递到函数中。我看到 make() 中的第二个参数是参数的长度?但我不太明白如何格式化变量以便正确传递我的参数。我递归地遇到错误消息:

reflect: Call with too few input arguments

任何帮助将不胜感激!

最佳答案

来自Value.Call documentation :

Call calls the function v with the input arguments in. For example, if len(in) == 3, v.Call(in) represents the Go call v(in[0], in[1], in[2]).

所以如果你想用一个参数调用一个函数,in必须包含一个reflect.Value 正确的类型,在你的例子中是 map[string][]string

表达式

in := make([]reflect.Value,0)

创建一个长度为 0 的 slice 。将其传递给 Value.Call 将导致您收到的 panic 需要 1 个参数,而不是零。

正确的调用应该是:

m := map[string][]string{"foo": []string{"bar"}}

in := []reflect.Value{reflect.ValueOf(m)}

myMethod.Call(in)

关于function - 如何在 reflect 包中正确使用 .Call,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20714939/

相关文章:

go - 为什么两个goroutine的控制台输出看起来像同步

c++ - 类/全局函数声明 C++

c - 只返回空格和字母的函数

ios - 引用由另一个函数创建的数组

go - BeforeSave 不填充数据

java - 如何仅通过知道类/接口(interface)的名称(非完全限定名称)来获取其详细信息

c - C 中接受字符串和 "filters out"所有非数字字符以及除第一个点之外的所有字符的函数?

go - 将 map 分配给 Golang 中的 map

java - 为什么Android获取类的声明字段是无序的?

c# - 如何从字符串表示中获取泛型类型?