在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上试试吧。