我有一个名为“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说:
使用没有选择器的包装播种机
答案 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>