我有兩個任務結構,即 ShellTask
# 和 CmdTask
。建立了 TaskExecutor
介面並實作了 ShellTask
和 CmdTask
指標接收器中的方法。並在運行時使用反射動態建立任務執行器。但是,當我在運行時運行程式時收到訊息 panic: interface conversion: main.ShellTask is not main.TaskExecutor: Missing method Run
錯誤,但是,如果我將指標接收器更改為非指標接收器,事情就會開始工作。
如何建立帶有指標的對象,以便指針接收器運作。
package main import ( "errors" "fmt" "reflect" ) type Task struct { Name string } type TaskExecutor interface { Run() error } type ShellTask struct { *Task } func (t *ShellTask) Run() error { fmt.Println("Running linux task") return nil } type CmdTask struct { *Task } func (t *CmdTask) Run() error { fmt.Println("Running linux task") return nil } var registry = make(map[string]reflect.Type) func Register(moduleName string, v interface{}) { registry[moduleName] = reflect.TypeOf(v) } func GetTaskExecutor(name string) (TaskExecutor, error) { if k, ok := registry[name]; ok { newPtr := reflect.New(k) e := newPtr.Elem() f := e.Interface().(TaskExecutor) return f, nil } return nil, errors.New("no task handler found") } func main() { Register("cmd", CmdTask{}) Register("shell", ShellTask{}) exec, err := GetTaskExecutor("shell") if err != nil { panic(err) } exec.Run() }
Go Playground 連結
#https://pkg.go.dev/[電子郵件受保護]#Value.Elem
因此,如果您想要指標而不是指向的值,則需要刪除 e := newPtr.Elem()
步驟。
func GetTaskExecutor(name string) (TaskExecutor, error) { if k, ok := registry[name]; ok { p := reflect.New(k) f := p.Interface().(TaskExecutor) return f, nil } return nil, errors.New("no task handler found") }
以上是如何使用具有指標接收器的反射建立類型的詳細內容。更多資訊請關注PHP中文網其他相關文章!