Heim > Backend-Entwicklung > Golang > Wie kann ich benutzerdefinierte Schnittstellen an Go 1.8-Plugins übergeben?

Wie kann ich benutzerdefinierte Schnittstellen an Go 1.8-Plugins übergeben?

Linda Hamilton
Freigeben: 2024-12-25 20:12:10
Original
275 Leute haben es durchsucht

How Can I Pass Custom Interfaces to Go 1.8 Plugins?

Go 1.8-Plugin verwendet benutzerdefinierte Schnittstelle

Viele Go-Plugins erfordern die Möglichkeit, komplexe benutzerdefinierte Schnittstellen an sie zu übergeben. Leider ist dies derzeit in der ursprünglichen Plugin-Implementierung normalerweise nicht möglich.

Eine Möglichkeit, dieses Problem zu vermeiden, besteht darin, das Plugin dazu zu bringen, einen Wert vom Typ interface{} zurückzugeben. Die Hauptanwendung kann dann die erwartete Schnittstelle definieren und die Typzusicherung für den vom Plugin zurückgegebenen Wert interface{} verwenden.

Der Plugin-Code könnte beispielsweise so aussehen:

package main

import (
    "fmt"
)

type plgFilter struct{}

func (plgFilter) Name() string {
    return "Bob"
}

func (plgFilter) Age() int {
    return 23
}

func GetFilterIface() (f interface{}, err error) {
    f = plgFilter{}
    fmt.Printf("[plugin GetFilterIface] Returning filter: %T %v\n", f, f)
    return
}
Nach dem Login kopieren

Und der Hauptanwendungscode könnte so aussehen:

package main

import (
    "fmt"
    "plugin"
)

func main() {
    p, err := plugin.Open("pg/pg.so")
    if err != nil {
        panic(err)
    }

    GetFilterIface, err := p.Lookup("GetFilterIface")
    if err != nil {
        panic(err)
    }

    filterIface, err := GetFilterIface.(func() (interface{}, error))()
    fmt.Printf("GetFilterIface result: %T %v %v\n", filterIface, filterIface, err)

    myfilter := filterIface.(MyFilter)
    fmt.Println("\tName:", myfilter.Name())
    fmt.Println("\tAge:", myfilter.Age())
}

type MyFilter interface {
    Name() string
    Age() int
}
Nach dem Login kopieren

Eine andere Lösung besteht darin, die Schnittstelle in einem Paket außerhalb des Plugins zu definieren, und sowohl das Plugin als auch Ihre Anwendung können sie importieren und beziehen Sie sich darauf.
Zum Beispiel, wenn die Schnittstelle im Paketfilter definiert ist:

package filter

type Filter interface {
    Name() string
    Age() int
}
Nach dem Login kopieren

Dann könnte der Plugin-Code so aussehen:

package main

import (
    "fmt"
    "filter"
)

type plgFilter struct{}

func (plgFilter) Name() string {
    return "Bob"
}

func (plgFilter) Age() int {
    return 23
}

func GetFilter() (f filter.Filter, err error) {
    f = plgFilter{}
    fmt.Printf("[plugin GetFilter] Returning filter: %T %v\n", f, f)
    return
}
Nach dem Login kopieren

Und das Wichtigste Der Anwendungscode könnte so aussehen:

package main

import (
    "fmt"
    "filter"
    "plugin"
)

func main() {
    p, err := plugin.Open("pg/pg.so")
    if err != nil {
        panic(err)
    }

    GetFilter, err := p.Lookup("GetFilter")
    if err != nil {
        panic(err)
    }

    filter, err := GetFilter.(func() (filter.Filter, error))()
    fmt.Printf("GetFilter result: %T %v %v\n", filter, filter, err)
    fmt.Println("\tName:", filter.Name())
    fmt.Println("\tAge:", filter.Age())
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie kann ich benutzerdefinierte Schnittstellen an Go 1.8-Plugins übergeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage