1 回答
TA贡献1757条经验 获得超8个赞
包不是 Go 中的一种类型。
给定一个foo带有 function的包Run,这可以工作......
v := reflect.ValueOf(foo.Run)
fmt.Println(v.Kind()) // func
但这是一个语法错误:
v := reflect.ValueOf(foo)
不要尝试使用反射,而是提前在映射中注册函数,然后在映射中查找正确的函数来调用它。您可以提供一个简单的tasks包来执行此操作,其中包含 和 之类的Register方法Run。
// tasks.go
package tasks
type TaskFunc func() error // or whatever arguments your tasks take
var 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.go
package forecast
import "tasks"
tasks.Register("forecast", Run)
func Run() error {
// ...
}
// main.go
err := tasks.Run(message.Task)
- 1 回答
- 0 关注
- 77 浏览
添加回答
举报