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

编码员

我有一个名为“ 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说:

不使用选择器的包播种器的使用

icza

您无法通过函数名称获得函数,而这正是您要尝试做的。原因是,如果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上尝试一下

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

检查带有前缀和后缀的单词

来自分类Dev

检查带有前缀和后缀的单词

来自分类Dev

Bash:重命名带有前缀后缀的文件

来自分类Dev

带有用户defind前缀和后缀的split命令

来自分类Dev

带有前缀的对象的调用元素

来自分类Dev

将列表转换为带有前缀和后缀的字符串

来自分类Dev

Unix行到列格式,带有字符串前缀和后缀

来自分类Dev

将列表转换为带有前缀和后缀的字符串

来自分类Dev

带有前缀和可选后缀的正则表达式

来自分类Dev

匹配带有前缀和后缀的字符串使用 Logstash grok 模式

来自分类Dev

在matlab中命名带有函数后缀的文件

来自分类Dev

带有参数的调用函数

来自分类Dev

如何使用宏调用只有后缀差异的函数?

来自分类Dev

如何调用带有函数参数的函数?

来自分类Dev

使用带有路径前缀的cherrypy公开函数

来自分类Dev

教义获取没有前缀或后缀的数组

来自分类Dev

如何调用以给定前缀开头的名称的所有函数?

来自分类Dev

您是否可以创建一个使用前缀和后缀调用的R函数(类似于方括号)?

来自分类Dev

在带有前缀,后缀或正则表达式的S3存储桶中搜索密钥?

来自分类Dev

带有额外后缀的文件

来自分类Dev

带有额外后缀的文件

来自分类Dev

为什么必须使用'typename'和':: type'前缀/后缀来调用所有type_traits类?

来自分类Dev

r函数调用带有子集的lm

来自分类Dev

带有参数的javascript匿名函数调用

来自分类Dev

调用带有Twig参数的函数

来自分类Dev

带有动态参数的调用函数

来自分类Dev

调用带有数组参数的函数

来自分类Dev

从html调用带有参数的javascript函数

来自分类Dev

C:带有负号的递归函数调用

Related 相关文章

热门标签

归档