Rumah > pembangunan bahagian belakang > Golang > Cara membuat jenis menggunakan refleksi dengan penerima penunjuk

Cara membuat jenis menggunakan refleksi dengan penerima penunjuk

王林
Lepaskan: 2024-02-06 08:45:07
ke hadapan
1158 orang telah melayarinya

Cara membuat jenis menggunakan refleksi dengan penerima penunjuk

Kandungan soalan

Saya mempunyai dua struktur tugas yang ShellTask​​CmdTask。创建了 TaskExecutor 接口并实现了 ShellTask​​CmdTask 指针接收器中的方法。并在运行时使用反射动态创建任务执行器。但是,当我在运行时运行程序时收到消息 panic: interface conversion: main.ShellTask​​ is not main.TaskExecutor: Missing method Run ralat, namun, jika saya menukar penerima penunjuk kepada penerima bukan penunjuk, perkara mula berfungsi.

Cara mencipta objek dengan penunjuk supaya penerima penunjuk berfungsi.

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()
}
Salin selepas log masuk

Go Playground Link


Jawapan Betul


https://pkg.go.dev/[email protected]#Value.Elem

Jadi jika anda mahu penunjuk bukannya nilai yang ditunjuk, anda perlu mengalih keluar langkah 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")
}
Salin selepas log masuk

Atas ialah kandungan terperinci Cara membuat jenis menggunakan refleksi dengan penerima penunjuk. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan