gpt4 book ai didi

reflection - 将字符串值转换为函数调用

转载 作者:IT王子 更新时间:2023-10-29 01:58:58 28 4
gpt4 key购买 nike

我想指定一个基于字符串的函数。我从 map 中获取字符串,在下面的示例中,它们是 function 中的值,同时在 map 上进行交互。例如,当字符串值 function == "networkInfo"时,我想将该值“视为”真正的函数名称。这很难解释,但我想你们会明白我的意思。

我的目标是去掉 switch 语句,直接调用 c.AddFunc(spec, func() { networkInfo() }) 其中 networkInfo 是函数名,从字符串 function 中提取。我知道这是可能的,但我不知道如何:(。感谢帮助!

// ScheduleCronjobs starts the scheduler
func ScheduleCronjobs() {

tasks := props.P.GetStringMapString("tasks")
log.Infof("number of tasks: %d", len(tasks))

if len(tasks) != 0 {
c := cron.New()

// for each task, initialize
for function, spec := range tasks {
switch function {
case "networkInfo":
c.AddFunc(spec, func() { networkInfo() })
case "bla":
c.AddFunc(spec, func() { bla() })
default:
log.Errorf("unknown task: %q", function)
}
}
c.Start()
}

// after initialization, send out confirmation message
slack.SendMessage("tasks initialized", props.P.GetString("channel"))
}

最佳答案

为什么不是这样的:

taskDefs := map[string]func(){
"networkInfo": networkInfo,
"bla": bla,
}

for function, spec := range tasks {
if fn, ok := taskDefs[function]; ok {
c.AddFunc(spec, func() { fn() }) // not sure if you need the enclosing func
} else {
log.Errorf("unknown task: %q", function)
}
}

如果您确实需要不同的函数签名,那么您实际上需要反射,但如果函数的类型都相同,那么使用这种映射方法可能是一个更简单的解决方案,没有反射的开销。

我发现在包中按名称查找函数的唯一方法是实际解析源文件。 This repo是查找函数并将它们存储在以名称作为键的映射中的示例。

Go 链接器会静静地删除未引用的函数,因此如果您引用函数的唯一方式是通过反射,它就会中断。这就是为什么我建议的 map 方法更优越;它让链接器知道正在使用 func。

关于reflection - 将字符串值转换为函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36239614/

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