So implementieren Sie Plug-Ins in Golang

王林
Freigeben: 2023-05-10 19:59:35
Original
1053 Leute haben es durchsucht

Mit der kontinuierlichen Erweiterung der Größe von Computersoftwaresystemen ist die Programmskalierbarkeit zum Schwerpunkt der meisten Unternehmen und Teams geworden. Ein gängiger Weg, Skalierbarkeit zu erreichen, ist eine steckbare Architektur. Durch den Plug-In-Mechanismus können die Funktionen des Programms jederzeit erweitert werden, ohne dass der Programmcode direkt geändert werden muss. Im Vergleich zur herkömmlichen modularen Architektur ist die Plug-in-Architektur flexibler, äußerst kohäsiv und verwaltbar. In diesem Artikel wird erläutert, wie Plug-In-Mechanismen in der Golang-Sprache entworfen und implementiert werden.

  1. Das Konzept des Plug-Ins

Ein Plug-In bezieht sich auf eine Komponente, die dynamisch geladen werden kann und die Funktionalität eines Programms erweitert. Plug-Ins sind in der Regel unabhängig vom Hauptprogramm und können geladen oder entladen werden, während das Hauptprogramm läuft. Plug-Ins enthalten in der Regel eine oder mehrere Schnittstellen, über die sie mit dem Hauptprogramm kommunizieren.

In der Plug-In-Architektur ist das Hauptprogramm für das Laden oder Entladen von Plug-Ins, die Kommunikation mit Plug-Ins und die Koordinierung der Zusammenarbeit zwischen Plug-Ins verantwortlich. Plug-Ins sind dafür verantwortlich, die von ihnen bereitgestellten Funktionen zu implementieren und sie dem Hauptprogramm für Aufrufe über vordefinierte Schnittstellen zur Verfügung zu stellen.

  1. Golang-Plug-In

In Golang können Sie dynamische Linkbibliotheken (Dynamic Linking Libraries) verwenden, um Plug-Ins zu implementieren. Die spezifischen Schritte sind wie folgt:

  • Definieren Sie die Schnittstelle oder den Strukturtyp des Plug-Ins. nach Bedarf einschreiben
  • Schreiben Sie den Plug-in-Code und kompilieren Sie ihn als dynamische Linkbibliothek
  • Stellen Sie Funktionsschnittstellen oder dynamische Bibliotheksfunktionsaufrufe im Hauptprogramm bereit, laden Sie die dynamische Linkbibliothek und rufen Sie den Plug-in-Code zur Laufzeit auf

Wir werden die oben genannten Schritte im Folgenden Schritt für Schritt umsetzen.

  1. Definieren Sie die Plug-in-Schnittstelle

Wir müssen bestimmen, was das Plug-in, das wir implementieren möchten, tun muss und welche Schnittstellen es bereitstellt. Am Beispiel eines einfachen Taschenrechnerprogramms definieren wir die Plug-in-Schnittstelle wie folgt:

package plugin

type CalculatorPlugin interface {
    GetName() string
    Add(int, int) int
    Sub(int, int) int
}
Nach dem Login kopieren
  1. Schreiben Sie den Plug-in-Code

Wir gehen davon aus, dass es zwei Plug-ins gibt: AddPlugin und SubPlugin. Sie alle implementieren die CalculatorPlugin-Schnittstelle.

AddPlugin implementiert zwei Methoden: GetName() und Add().

package main

import (
    "github.com/bwmarrin/discordgo"
    "github.com/derry6/DSGO_BOT/plugin"
)

type AddPlugin struct {
}

func (ap *AddPlugin) GetName() string {
    return "加法插件"
}

func (ap *AddPlugin) Add(a, b int) int {
    return a + b
}

func New() plugin.CalculatorPlugin {
    return &AddPlugin{}
}

func main() {}
Nach dem Login kopieren

SubPlugin implementiert zwei Methoden: GetName() und Sub().

package main

import (
    "github.com/bwmarrin/discordgo"
    "github.com/derry6/DSGO_BOT/plugin"
)

type SubPlugin struct {
}

func (sp *SubPlugin) GetName() string {
    return "减法插件"
}

func (sp *SubPlugin) Sub(a, b int) int {
    return a - b
}

func New() plugin.CalculatorPlugin {
    return &SubPlugin{}
}

func main() {}
Nach dem Login kopieren

Was im Code beachtet werden muss, ist die Funktion New(), die einen Wert vom Schnittstellentyp CalculatorPlugin zurückgibt. Das Hauptprogramm verwendet diese Funktion, um das Plug-In dynamisch zu laden.

  1. Kompilieren Sie das Plug-in

Verwenden Sie den Befehl go build, um das Plug-in zu kompilieren und eine dynamische Linkbibliothek zu generieren.

go build -buildmode=plugin -o add.so add.go
go build -buildmode=plugin -o sub.so sub.go
Nach dem Login kopieren
  1. Laden von Plug-Ins im Hauptprogramm

Das Hauptprogramm ist für das Laden von Plug-Ins verantwortlich. Wir müssen eine Funktion definieren, um das Plug-In entsprechend dem Pfad zu laden, in dem es sich befindet.

func LoadPlugin(path string) (p plugin.CalculatorPlugin, err error) {
    plugin, err := plugin.Open(path)
    if err != nil {
        return nil, err
    }
    symbol, err := plugin.Lookup("New")
    if err != nil {
        return nil, err
    }
    return symbol.(func() plugin.CalculatorPlugin)(), nil
}
Nach dem Login kopieren
  1. Verwenden Sie die Plug-In-Funktion

Nachdem das Hauptprogramm das Plug-In geladen hat, können wir den Namen des Plug-Ins abrufen und über die vom Plug-In bereitgestellten Methoden Additions- und Subtraktionsoperationen ausführen. Das Folgende ist ein Beispielcode:

package main

import (
    "fmt"
    "github.com/derry6/DSGO_BOT/plugin"
)

func main() {
    addPlugin, _ := LoadPlugin("./add.so")
    subPlugin, _ := LoadPlugin("./sub.so")

    fmt.Println("插件名称: ", addPlugin.GetName())
    fmt.Println("3 + 2 = ", addPlugin.Add(3, 2))

    fmt.Println("插件名称: ", subPlugin.GetName())
    fmt.Println("3 - 2 = ", subPlugin.Sub(3, 2))
}
Nach dem Login kopieren
  1. Zusammenfassung

Die Plug-inisierung in Golang wird durch dynamische Linkbibliotheken erreicht. Mit dem Plug-in-Mechanismus kann die Skalierbarkeit und Wartbarkeit des Codes erheblich verbessert werden. Wenn wir neue Funktionen hinzufügen müssen, müssen wir nur entsprechende Plug-Ins schreiben, anstatt den ursprünglichen Code des Programms zu ändern. Die Designidee der Plug-In-Architektur und die Implementierung von Golang-kompilierten Plug-Ins können es uns ermöglichen, Software-Engineering besser zu entwerfen und zu entwickeln.

Das obige ist der detaillierte Inhalt vonSo implementieren Sie Plug-Ins in Golang. 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage