Heim >Backend-Entwicklung >Golang >Wie kann ich benutzerdefinierte Schnittstellen effektiv in Go-Plugins verwenden?

Wie kann ich benutzerdefinierte Schnittstellen effektiv in Go-Plugins verwenden?

DDD
DDDOriginal
2024-12-24 03:47:18200Durchsuche

How Can I Use Custom Interfaces Effectively within Go Plugins?

Benutzerdefinierte Schnittstellen in Go-Plugins

Frage: Wie kann ich benutzerdefinierte Schnittstellen mit Go-Plugins verwenden?

Hintergrund: Kundenspezifische Schnittstellen sind für die Implementierung wiederverwendbarer und erweiterbarer Softwarekomponenten unerlässlich. Erste Versuche, sie innerhalb von Go-Plugins zu verwenden, führten jedoch zu folgendem Fehler:

panic: interface conversion: plugin.Symbol is func() (filter.Filter, error), not func() (filter.Filter, error)

Antwort:

Während Go-Plugins nicht auf Typen zugreifen können, die im Plugin selbst definiert sind , ist es möglich, benutzerdefinierte Schnittstellen zu verwenden, indem Sie die folgenden Methoden befolgen:

1. Verwenden eines gemeinsamen Pakets:

Definieren Sie die Schnittstelle in einem Paket, das sowohl vom Plugin als auch von der Hauptanwendung importiert wird. Dieser Ansatz ermöglicht es beiden Komponenten, dieselbe Typdefinition zu verwenden.

2. Eine Schnittstelle{} vom Plugin zurückgeben:

Lassen Sie die Plugin-Funktion einen Wert vom Typ Schnittstelle{} zurückgeben. Die Hauptanwendung kann dann eine Typzusicherung für den zurückgegebenen Wert definieren, um die benutzerdefinierte Schnittstelle zu verwenden.

Beispiel:

Main Anwendung:

package main

import (
    "fmt"
    "plugin"

    "github.com/fagongzi/gateway/pkg/filter"
)

func main() {
    // ...
    GetInstance(func() (filter.Filter, error)) // Error occurs
}

Plugin:

package plugin

import "github.com/fagongzi/gateway/pkg/filter"

type plgFilter struct{}

func (plgFilter) Name() string   { return "Bob" }
func (plgFilter) Age() int      { return 23 }

// Return an "empty" filter to satisfy the function signature
func GetInstance() (filter.Filter, error)         { return nil, nil }
func GetInstanceInter() (interface{}, error)       { return &plgFilter{}, nil }
func GetInstancePtr() (*plgFilter, error)      { return &plgFilter{}, nil }

Vergleich:

  • Option 1: Erfordert das Vorhandensein der Schnittstelle sowohl im Plugin als auch in der Anwendung Code.
  • Option 2: Ermöglicht dem Plugin, Werte jeden Typs zurückzugeben, was mehr Flexibilität bietet.

Zusätzliche Hinweise:

  • Benutzerdefinierte Schnittstellen können nur innerhalb von Plugins verwendet werden, die keine anderen haben Abhängigkeiten.
  • Plugins können keine eigenen Schnittstellen definieren, auf die von der Hauptanwendung aus verwiesen werden kann.

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

Stellungnahme:
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