gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:04:50 24 4
gpt4 key购买 nike

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

use of package seeder without selector

最佳答案

你不能通过它的名字得到一个函数,这就是你想要做的。原因是如果 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() 辅助函数中调用由其名称标识的函数由您决定,或者您可以选择返回一个函数值(类型为 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 .

关于string - 调用带有特殊前缀/后缀的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37384473/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com