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

带有特殊前缀/后缀的调用函数

吴英武
2023-03-14
问题内容

我有一个名为“ seeder”的软件包:

package seeder

import "fmt"

func MyFunc1() {
    fmt.Println("I am Masood")
}

func MyFunc2() {
    fmt.Println("I am a programmer")
}

func MyFunc3() {
    fmt.Println("I want to buy a car")
}

现在我想用MyFunc前缀调用所有函数

package main

import "./seeder"

func main() {
    for k := 1; k <= 3; k++ {
        seeder.MyFunc1() // This calls MyFunc1 three times
    }
}

我想要这样的东西:

for k := 1; k <= 3; k++ {
    seeder.MyFunc + k ()
}

这个输出:

I am Masood
I am a programmer
I want to buy a car

EDIT1 :在此示例中,parentKey是在循环中更改的字符串变量

for parentKey, _ := range uRLSjson{ 
    pppp := seeder + "." + strings.ToUpper(parentKey)
    gorilla.HandleFunc("/", pppp).Name(parentKey)
}

但是GC说:

使用没有选择器的包播种机


问题答案:

您无法通过函数名称获得函数,而这正是您想要做的。原因是,如果Go工具可以检测到未显式引用某个函数(因此无法访问该函数),则该函数甚至可能无法编译为可执行二进制文件。

具有功能注册表

一种执行所需操作的方法是在调用它们之前构建“功能注册表”:

registry := map[string]func(){
    "MyFunc1": MyFunc1,
    "MyFunc2": MyFunc2,
    "MyFunc3": MyFunc3,
}
for k := 1; k <= 3; k++ {
    registry[fmt.Sprintf("MyFunc%d", k)]()
}

输出(在Go Playground上尝试):

Hello MyFunc1
Hello MyFunc2
Hello MyFunc3

手动“路由”

与注册表类似,它检查名称并手动路由到该函数,例如:

func callByName(name string) {
    switch name {
    case "MyFunc1":
        MyFunc1()
    case "MyFunc2":
        MyFunc2()
    case "MyFunc3":
        MyFunc3()
    default:
        panic("Unknown function name")
    }
}

使用它:

for k := 1; k <= 3; k++ {
    callByName(fmt.Sprintf("MyFunc%d", k))
}

在Go Playground上尝试一下。

注意:
由您决定是否要在callByName()帮助函数中调用由其名称标识的函数,或者您可以选择返回一个函数值(类型为func())并在调用者的位置调用它。

将函数转换为方法

还要注意,如果您的函数实际上是某种类型的 方法
,则可以在没有注册表的情况下进行操作。使用反射,您可以按名称获取方法:Value.MethodByName()。您还可以使用Value.NumMethod()和获取/枚举所有方法而无需知道它们的名称Value.Method()(另请参见Type.NumMethod()以及Type.Method()是否需要该方法的名称或其参数类型)。

这是可以做到的:

type MyType int

func (m MyType) MyFunc1() {
    fmt.Println("Hello MyFunc1")
}

func (m MyType) MyFunc2() {
    fmt.Println("Hello MyFunc2")
}

func (m MyType) MyFunc3() {
    fmt.Println("Hello MyFunc3")
}

func main() {
    v := reflect.ValueOf(MyType(0))
    for k := 1; k <= 3; k++ {
        v.MethodByName(fmt.Sprintf("MyFunc%d", k)).Call(nil)
    }
}

输出是相同的。在Go Playground上尝试一下。



 类似资料:
  • 我在互联网上搜索了一个很好的实现,它不是把数字表达式,而是把变量表达式从中缀符号转换成前缀和后缀。我做的所有搜索都没有成功。基本上,我想看看PHP中是否有任何实现,这样我就可以修改它以支持更多的操作符,而不仅仅是(-,*,=)。 例如转换: 同时保留变量名,不必输入数字进行计算。

  • 问题内容: 哪种结构提供最佳性能结果;trie(前缀树),后缀树还是后缀数组?还有其他类似的结构吗?这些结构的良好Java实现是什么? 编辑:在这种情况下,我想在大型名称字典和大量自然语言文本之间进行字符串匹配,以便在文本上标识字典的名称。 问题答案: 特里树是第一个发现的这种数据结构。 后缀树是对trie的改进(它具有后缀链接,允许线性错误搜索,后缀树修剪了trie的不必要分支,因此不需要太多空

  • 当你编写一个算术表达式如 B*C 时,表达式的形式使你能够正确理解它。在这种情况下,你知道 B 乘以 C, 因为乘法运算符 * 出现在表达式中。这种类型的符号称为中缀,因为运算符在它处理的两个操作数之间。看另外一个中缀示例,A+B*C,运算符 + 和 * 仍然出现在操作数之间。这里面有个问题是,他们分别作用于哪个运算数上,+ 作用于 A 和 B , 还是 * 作用于 B 和 C?表达式似乎有点模糊

  • 目前,我正在使用一个使用开放Api规范的api,该规范是使用斯瓦格生成的。在 API 中有多个终结点,例如 。这会导致代码生成生成一个客户端,该客户端仅使用数字列出方法。 最好有一个名为和。(或任何区别他们的东西) (如何)使用我的nswag配置实现这一点?我也可以改变OpenApi json的生成 我的 nswag 文件如下所示: 我的swagger文件看起来像这样

  • 我对spring boot和创建我的第一个应用程序非常陌生。创建数据源时,我使用了带有前缀的@ConfigurationProperties和要从Application.Property中读取的属性。 但是,这个设置似乎对我不起作用,我的程序没有运行。 我的pom.xml文件包含: 我的存储库类: 我的主要类: 请让我知道如果我需要提供任何其他信息以及。