目前我將包名稱作為字串"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();
uj5u.com熱心網友回復:
包不是 Go 中的一種型別。
給定一個foo帶有函式的包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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/339725.html
標籤:走
上一篇:golang中的正則運算式匹配
