登录
首页 >  Golang >  Go问答

如何正确使用反射包中的.Call

来源:Golang技术栈

时间:2023-04-10 18:47:21 450浏览 收藏

在Golang实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天golang学习网就整理分享《如何正确使用反射包中的.Call》,聊聊golang,希望可以帮助到正在努力赚钱的你。

问题内容

我的代码遇到了最后一个问题,它涉及反射包中的 .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

Callv使用输入参数 in 调用函数。例如, iflen(in) == 3表示v.Call(in)Go 调用v(in[0], in[1], in[2])

所以如果你想用一个参数调用一个函数,in必须包含一个reflect.Value正确的类型,在你的情况下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)

本篇关于《如何正确使用反射包中的.Call》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>