当前位置: 首页 > 面试题库 >

使用Go Reflect调用函数

漆雕奇逸
2023-03-14
问题内容

我想知道是否有可能不知道函数名称而是无论如何都要调用它并从中获取值。这使我进入了反射包,我已经很接近了,但是我不确定最后一步-
如果有的话。同样,如果我遗漏了一些明显的东西,请原谅我,这是我第一次尝试在Go中做任何事情,而不是进行设置。

当然,作为一种编译语言,不需要遍历所有东西来查找函数名称,我都知道它们,但这是我想看看是否有可能……我正在学习。

下面是代码。我真正想做的是在主行中提取在ModuleBoot()<“ 1.0012”,23>和SomethingBoot()<“
1.0000”,10>中设置的值,但到目前为止,我所能获得的只是结构信息。也许就是这样,但是也许有一个步骤或更改可以使它迈出下一步。

希望我能正确复制所有相关代码,以便按原样编译:

// Using: go version go1.9.7 linux/amd64
=======================================
FILE: main.go
=======================================
package main

import (
  "fmt"
  "reflect"
  "playing/modules/core"
)

func main() {

  miType := reflect.TypeOf(core.ModuleInfo{})

  fmt.Println("")

  for i := 0; i < miType.NumMethod(); i++ {
    method := miType.Method(i)
    fmt.Println(method.Name)

    in := make([]reflect.Value, method.Type.NumIn())
    in[0] = reflect.ValueOf(core.ModuleInfo{})
    //fmt.Println("Params in:", method.Type.NumIn(), "Params out:", method.Type.NumOut())

    mi := method.Func.Call(in)
    fmt.Println("mi:", mi)

    fmt.Println("")
  }
}

=======================================
FILE: playing/modules/core/something.go
=======================================
package core

func (mi ModuleInfo) SomethingBoot() ModuleInfo {
  mi.Version = "1.0000"
  mi.Priority = 10
  return mi
}

=======================================
FILE: playing/modules/core/modules.go
=======================================
package core

type ModuleInfo struct {
  Version string
  Priority int
}

func (mi ModuleInfo) ModuleBoot() ModuleInfo {
  mi.Version = "1.0012"
  mi.Priority = 23
  return mi
}

我从中得到的输出是:

Started delve with config "Debug"

SomethingBoot
mi: [<core.ModuleInfo Value>]

ModuleBoot
mi: [<core.ModuleInfo Value>]

delve closed with code 0

问题答案:

为了得到返回值作为ModuleInfo,获得潜在价值的第一个返回值的类型断言该接口值ModuleInfo:

// mi has type core.ModuleInfo
mi := method.Func.Call(in)[0].Interface().(core.ModuleInfo)

在Playground上运行它。

您可以通过将方法类型声明为具有正确签名的函数并直接调用该函数来剪切一些反射代码:

for i := 0; i < miType.NumMethod(); i++ {
    method := miType.Method(i).Func.Interface().(func(core.ModuleInfo) core.ModuleInfo)
    mi := method(core.ModuleInfo{})
    fmt.Println("Version", mi.Version)
    fmt.Println("Priority", mi.Priority)
    fmt.Println("")
}

在操场上运行



 类似资料:
  • 问题内容: 当用户单击链接时,我需要调用ColdFusion函数(存在于.cfm文件中)。我想使用jQuery做到这一点。我有一个jQuery片段,看起来像- 我对jQuery和AJAX都是新手,所以在这里听起来我很幼稚。我应该使用AJAX调用ColdFusion函数吗?诸如请求在服务器上执行特定功能之类的东西。 在这方面的任何帮助,表示赞赏。 干杯。 问题答案: 如果您的cfm中有多个功能(即使

  • 问题内容: 我正在使用Ionic,并且想要根据数据动态更改每个项目的背景色。我以为我可以通过函数调用的方式返回正确的类 目前是控制器 在检查控制台时,列表中的每个函数均被调用7次。这是为什么,我应该避免在其中使用函数调用吗? 问题答案: AngularJS可以进行脏检查:它需要在 每个循环中 调用该函数,以确保它不返回新值,并且不需要更新DOM。 这是框架典型过程的一部分,调用像您这样简单的函数不

  • 问题内容: 如果有人提出这个问题,我深表歉意,但是我找不到任何答案或解决方案。我想从“ UIWebView”中调用JavaScript函数,并迅速进行监听。我发现的任何示例都使用“ WKWebView”。必须有一种简单的方法来监听JavaScript函数,如下所示: UIWebView是否可能?谢谢大家! 问题答案: 像这样实现: 然后在您的课程中使用以下代码来监听此URL : 不要忘记在Xcod

  • 问题内容: 好的,我知道有人问过这个问题,但是我对PHP和JavaScript还是很陌生,直到我开始寻找这个问题的答案之前,我才听说过Ajax,所以不理解以前的答案。 我正在创建一个站点,该站点本质上是SQL数据库中的一堆视频,它一次显示一个视频,我想要一个下一个和上一个视频按钮。 但是我无法摆脱这种ajax的问题​​,所以我的问题更加简单。 我已经复制了确切的代码, 在我的文件中,我实际上只是对

  • 问题内容: 这可能是一个简单的答案,但是我正在使用jQuery的$ .ajax调用PHP脚本。我要做的基本上是将PHP脚本放入函数中,然后从javascript调用PHP函数。 对此 我如何在javascript中调用该函数?现在,我只使用$ .ajax和列出的PHP文件。 问题答案: 使用调用服务器上下文(或URL,或其他)来调用特定的“动作”。您想要的是这样的: 在服务器端,应读取POST参数

  • 问题内容: 首先,最感谢您解决我的问题,以及您可能提供的任何帮助! 好的,就像标题所说的,我需要从索引页面调用php函数,该函数使用JQuery Ajax在数据库中添加新记录作为投票。此函数将返回一个整数,然后将其打印在调用它的表单按钮内。 有人对我将如何实现这一目标有想法吗?任何指导表示赞赏! 我猜是表单动作属性发布了吗? 问题答案: 是的,创建一个单独的PHP文件,该文件调用该函数并回显输出。