Heim > Backend-Entwicklung > Golang > Wie kann ich benutzerdefinierte Schnittstellen mit Go 1.8-Plugins verwenden?

Wie kann ich benutzerdefinierte Schnittstellen mit Go 1.8-Plugins verwenden?

Susan Sarandon
Freigeben: 2024-12-27 19:02:09
Original
264 Leute haben es durchsucht

How Can I Use Custom Interfaces with Go 1.8 Plugins?

Verwenden benutzerdefinierter Schnittstellen in Go 1.8-Plugins

In Go 1.8 können Plugins benutzerdefinierte Schnittstellen verwenden. Es sind jedoch einige Einschränkungen zu berücksichtigen.

Verwendung eines externen Pakets

Ein Ansatz besteht darin, die Schnittstelle in einem externen Paket zu definieren und es sowohl vom Plugin als auch von der Hauptanwendung importieren zu lassen.

Erstellen Sie beispielsweise eine Schnittstelle in einem Paket namens Filter:

package filter

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

Im Plugin importieren Sie das Filterpaket und implementieren es Schnittstelle:

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

In der Hauptanwendung das Filterpaket importieren und das Plugin laden:

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

Dieser Ansatz stellt sicher, dass das Plugin Zugriff auf die Schnittstellendefinition hat.

Rückgabe der Schnittstelle{}

Eine andere Option besteht darin, dass das Plugin einen Wert vom Typ Schnittstelle zurückgibt{}. Die Hauptanwendung kann dann die erwartete Schnittstelle definieren und die Typzusicherung für den zurückgegebenen Wert verwenden.

Zum Beispiel im Plugin:

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

In der Hauptanwendung:

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

Dieser Ansatz bietet mehr Flexibilität, erfordert jedoch im Wesentlichen eine Typzusicherung Anwendung.

Einschränkungen

Beachten Sie, dass benutzerdefinierte Schnittstellen nur funktionieren, wenn die Schnittstelle außerhalb des Plugins definiert ist. Dies liegt daran, dass Go-Plugins eigenständige Module sind, die nicht auf in anderen Paketen definierte Typen zugreifen können.

Das obige ist der detaillierte Inhalt vonWie kann ich benutzerdefinierte Schnittstellen mit Go 1.8-Plugins verwenden?. 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