在Golang中调用所有具有特殊前缀或后缀的函数

我有一个与播种名称的包:

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 call three times MyFunc1 } } 

我想要这样的东西:

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

我想要这个输出:

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

EDIT1 :在这个例子中,parentKey是一个stringvar,它在一个循环中变化

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

但是GC说:

使用没有select器的包裹播种机

最后function是由用户写的,我将把这些function与特殊的前缀或后缀,如“路由”连接到大猩猩。

你不能通过它的名字得到一个函数,那就是你想要做的。 原因是,如果Go工具可以检测到一个函数没有被明确引用(因此不可用),它甚至可能不会被编译到可执行的二进制文件中。 有关详细信息,请参阅拆分客户端/服务器代码 。

用一个函数registry

您只能在调用它们之前创build“函数registry”

 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 

手动“路由”

类似于registry是检查名称和手动路由到该function,例如:

 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游乐场试试这个。

注意:如果您想在callByName()助手函数中调用由其名称标识的函数,则callByName()您,或者您可以select返回函数值(types为func() ),并在调用者的地方调用它。

将函数转换为方法

还要注意,如果你的函数实际上是某种types的方法 ,你可以在没有registry的情况下完成。 使用reflection,您可以按名称获取方法: Value.MethodByName() 。 你也可以使用Value.NumMethod()Value.Method()来获取/枚举所有的方法,而不需要知道它们的名字Type.Method()如果你需要方法的名字或者它的参数types,也可以参考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上试试吧。