1 回答

TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超8個(gè)贊
包不是 Go 中的一種類型。
給定一個(gè)foo帶有 function的包Run,這可以工作......
v := reflect.ValueOf(foo.Run)
fmt.Println(v.Kind()) // func
但這是一個(gè)語法錯(cuò)誤:
v := reflect.ValueOf(foo)
不要嘗試使用反射,而是提前在映射中注冊(cè)函數(shù),然后在映射中查找正確的函數(shù)來調(diào)用它。您可以提供一個(gè)簡(jiǎn)單的tasks包來執(zhí)行此操作,其中包含 和 之類的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 關(guān)注
- 98 瀏覽
添加回答
舉報(bào)