通过反映其名称从包中运行函数

目前我将包名称作为一个字符串"Forecast",我需要将此字符串反映到一个包中,以便我可以调用该函数Run()。有没有办法进行这种反思?


为什么?


目前我正在 golang 中构建一个任务运行器,其中所有任务都具有该功能Run(),并且我通过 kafka 消息接收要运行的任务"task": "Forecast",所以我试图避免switch类似:


switch message.Task {

  case "Forecast":

    Forecast.Run()

  case "SupplyCalculator":

    SupplyCalculator.Run()

}

而只是反映名称并调用函数,如下所示(PHP):


$task = new ReflectionClass("\\Task\\{$message->task}");

$task->run();


拉风的咖菲猫
浏览 78回答 1
1回答

陪伴而非守候

包不是 Go 中的一种类型。给定一个foo带有 function的包Run,这可以工作......v := reflect.ValueOf(foo.Run)fmt.Println(v.Kind()) // func但这是一个语法错误:v := reflect.ValueOf(foo)不要尝试使用反射,而是提前在映射中注册函数,然后在映射中查找正确的函数来调用它。您可以提供一个简单的tasks包来执行此操作,其中包含 和 之类的Register方法Run。// tasks.gopackage taskstype TaskFunc func() error // or whatever arguments your tasks takevar taskFuncs = map[string]TaskFunc{}func Register(name string, fn TaskFunc) {  taskFuncs[name] = fn}func Run(name string) error {  if fn, found := taskFuncs[name]; found {    return fn()  }  return fmt.Errorf("Task %q not found", name)}// forecast.gopackage forecastimport "tasks"tasks.Register("forecast", Run)func Run() error {   // ...}// main.goerr := tasks.Run(message.Task)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go