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

时间:2016-05-23 07:00:18

标签: string function go

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

  

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

2 个答案:

答案 0 :(得分:17)

你无法通过它的名字获得一个功能,而这正是你想要做的。原因是,如果Go工具可以检测到某个函数未被显式引用(因此无法访问),则它甚至可能无法编译到可执行二进制文件中。有关详细信息,请参阅Splitting client/server code

使用函数注册表

实现目标的一种方法是在调用它们之前构建一个“函数注册表”:

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()辅助函数中调用由其名称标识的函数,或者您可以选择返回函数值(类型为{ {1}})并在调用者的位置调用它。

将函数转换为方法

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

这是如何做到的:

Type.Method()

输出是一样的。在Go Playground上尝试。

答案 1 :(得分:0)

另一种选择是覆盖函数的范围

 .single_add_to_cart_button {
animation: shake 0.82s cubic-bezier(.36,.07,.19,.97) both,
pulse 2s infinite;
transform: translate3d(0,0,0);
backface-visibility: hidden;
perspective: 1000px;
animation-duration: 6s;
-webkit-animation-iteration-count: infinite;
animation-iteration-count: infinite;}

@-webkit-keyframes pulse {0%{-webkit-transform:scale(.98);transform:scale(.98)}70%{-webkit-transform:scale(1);transform:scale(1)}to{-webkit-transform:scale(.98);transform:scale(.98)}}@keyframes pulse{0%{-webkit-transform:scale(.98);transform:scale(.98)}70%{-webkit-transform:scale(1);transform:scale(1)}to{-webkit-transform:scale(.98);transform:scale(.98)}}

@keyframes shake{from,16%,to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}1.6%,4.8%{-webkit-transform:translate3d(-1px,0,0);transform:translate3d(-1px,0,0)}8%,11.2%,14.4%{-webkit-transform:translate3d(-4px,0,0);transform:translate3d(-4px,0,0)}9.6%,12.8%{-webkit-transform:translate3d(4px,0,0);transform:translate3d(4px,0,0)}3.2%,6.4%{-webkit-transform:translate3d(2px,0,0);transform:translate3d(2px,0,0)}}

<button type="submit" class="single_add_to_cart_button button alt disabled wc-variation-selection-needed">YES,I WANT IT NOW</button>