donglu5047 2014-04-20 09:01
浏览 23
已采纳

如何使用反射包访问函数的返回数据?

I have a function of the IndexController type:

func (this IndexController) ActionIndex() map[string]string {
    return map[string]string{"Name": "Hello from the actionIndex()!"}
}

It is used so:

routerInstance := router.Constructor(request)

controllerObject := controllers[routerInstance.GetRequestController(true)]

outputData := reflect.ValueOf(controllerObject).MethodByName(routerInstance.GetRequestAction(true)).Call([]reflect.Value{})

fmt.Println(outputData)

Now for example, how to show the Name element of outputData? I try to print so:

fmt.Println(outputData["Name"])

But program will exit with error:

# command-line-arguments
./server.go:28: non-integer array index "Name"

I will be thankful!

  • 写回答

1条回答 默认 最新

  • dtz55359 2014-04-20 09:42
    关注

    First, (v Value) Call(…) returns a []reflect.Value, so you need to index it to get your actual return value:

    outputData := reflect.ValueOf(controllerObject).MethodByName(routerInstance.GetRequestAction(true)).Call([]reflect.Value{})[0]
    

    (note the [0] at the end of the line)

    From there on, you could probably do a type switch or maybe an interface conversion like outputData.(map[string]interface{}) to get a map that you can index by string.

    It would help though if you would provide your entire server.go file, or maybe put it up on play.golang.org.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 DS18B20内部ADC模数转换器
  • ¥15 做个有关计算的小程序
  • ¥15 MPI读取tif文件无法正常给各进程分配路径
  • ¥15 如何用MATLAB实现以下三个公式(有相互嵌套)
  • ¥30 关于#算法#的问题:运用EViews第九版本进行一系列计量经济学的时间数列数据回归分析预测问题 求各位帮我解答一下
  • ¥15 setInterval 页面闪烁,怎么解决
  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动