© Liashko/Shutterstock.com
Entwickler Magazin
Kolumne: Die Golumne

Plug-ins mit Go

Ein Großteil der Projekte auf Basis von Go sind reine Open-Source-Anwendungen oder unternehmensinterne Anwendungen, die Open Source nutzen. In beiden Fällen sind modulare Erweiterungen auf Basis vordefinierter APIs kein Problem. Als Entwickler eines Systems definiere ich ein Interface, und der erweiternde Entwickler kann es nach seinen Vorstellungen implementieren. Anschließend wird vom neuen Typ eine Instanz erzeugt und an mein System übergeben. So oder in ähnlicher Form ein altbekanntes Muster.

Frank Müller


Doch wie schaut es aus, wenn ich ein geschlossenes Binary ausliefern möchte, es jedoch durch den Nutzer erweiterbar sein soll? Oder ich plane, dass Nutzer meines mit Go erstellten Binarys dieses durch mitgelieferte Komponenten individualisieren können sollen? Auch hierfür bietet Go die Unterstützung, allerdings mit Einschränkungen. Dazu später mehr. Die Basis für die Erweiterungen sind die Plug-ins. Der Compiler erlaubt die Erzeugung von Shared Libraries in einer für Go nutzbaren Variante, das Package plugin [1] erlaubt das dynamische Laden und die Nutzung der exportierten Komponenten. Hierbei handelt es sich um die globalen Variablen und Funktionen des jeweiligen Plug-ins.Auf diesem Weg kann ich austauschbare Komponenten entwickeln, zum Beispiel für die Unterstützung unterschiedlicher Sprachen in meinem Programm. Ein anderer Anwendungsfall ist die Integration externer Systeme. Hier definiere ich Funktionen oder ein Interface, das ich von einem Plug-in erwarte, und lade es auf Basis meiner Konfiguration. Und natürlich kann ich auch mehrere Plug-ins mit gleicher Schnittstelle parallel laden und eine Laufzeitumgebung für ihre Zusammenarbeit bilden, zum Beispiel in einem System zum Event Processing.Jedoch deuten die Shared Libraries schon eine Einschränkung an. Während eine Erweiterung über Quellcode in der Regel auf allen unterstützten Plattformen von Go zum Einsatz kommen kann, sind die Plug-ins derzeit auf die Betriebssysteme Linux und macOS eingeschränkt. Gleichzeitig müssen die Laufzeitsysteme des Hauptprogramms und der Bibliotheken natürlich zueinander passen. Doch wenn das zu den eigenen Anforderungen passt, spricht nichts gegen den Einsatz der Plug-ins.Technisch gesehen ist die Implementierung eines Plug-ins trivial. Denn eigentlich handelt es sich nur um ein Package mit dem Namen main ohne die sonst übliche main()-Funktion. Vielmehr enthält das Package exportierte Funktionen und Variablen. Letztere können einfache Datentypen, aber auch Strukturen mit Methoden sein. Dies wird anschließend mit dem Befehl go build -buildmode=plugin übersetzt. Ergebnis ist die Library mit dem Names des Verzeichnisses, ganz entsprechend der Übersetzung von ausführbaren Programmen. Eine Datei foo/main.go wird also zur Datei foo/foo.so. Und wie auch bei Programmen, lässt sich hier mit dem Parameter -o ein alternativer Name setzen.Plug-ins entwickelnDie zu erfüllende Schnittstelle eines Plug-ins soll an dieser Stelle eine Variable Logger sein. Ihr Typ erfüllt ein Interfac...

Entwickler Magazin
Kolumne: Die Golumne

Plug-ins mit Go

Ein Großteil der Projekte auf Basis von Go sind reine Open-Source-Anwendungen oder unternehmensinterne Anwendungen, die Open Source nutzen. In beiden Fällen sind modulare Erweiterungen auf Basis vordefinierter APIs kein Problem. Als Entwickler eines Systems definiere ich ein Interface, und der erweiternde Entwickler kann es nach seinen Vorstellungen implementieren. Anschließend wird vom neuen Typ eine Instanz erzeugt und an mein System übergeben. So oder in ähnlicher Form ein altbekanntes Muster.

Frank Müller


Doch wie schaut es aus, wenn ich ein geschlossenes Binary ausliefern möchte, es jedoch durch den Nutzer erweiterbar sein soll? Oder ich plane, dass Nutzer meines mit Go erstellten Binarys dieses durch mitgelieferte Komponenten individualisieren können sollen? Auch hierfür bietet Go die Unterstützung, allerdings mit Einschränkungen. Dazu später mehr. Die Basis für die Erweiterungen sind die Plug-ins. Der Compiler erlaubt die Erzeugung von Shared Libraries in einer für Go nutzbaren Variante, das Package plugin [1] erlaubt das dynamische Laden und die Nutzung der exportierten Komponenten. Hierbei handelt es sich um die globalen Variablen und Funktionen des jeweiligen Plug-ins.Auf diesem Weg kann ich austauschbare Komponenten entwickeln, zum Beispiel für die Unterstützung unterschiedlicher Sprachen in meinem Programm. Ein anderer Anwendungsfall ist die Integration externer Systeme. Hier definiere ich Funktionen oder ein Interface, das ich von einem Plug-in erwarte, und lade es auf Basis meiner Konfiguration. Und natürlich kann ich auch mehrere Plug-ins mit gleicher Schnittstelle parallel laden und eine Laufzeitumgebung für ihre Zusammenarbeit bilden, zum Beispiel in einem System zum Event Processing.Jedoch deuten die Shared Libraries schon eine Einschränkung an. Während eine Erweiterung über Quellcode in der Regel auf allen unterstützten Plattformen von Go zum Einsatz kommen kann, sind die Plug-ins derzeit auf die Betriebssysteme Linux und macOS eingeschränkt. Gleichzeitig müssen die Laufzeitsysteme des Hauptprogramms und der Bibliotheken natürlich zueinander passen. Doch wenn das zu den eigenen Anforderungen passt, spricht nichts gegen den Einsatz der Plug-ins.Technisch gesehen ist die Implementierung eines Plug-ins trivial. Denn eigentlich handelt es sich nur um ein Package mit dem Namen main ohne die sonst übliche main()-Funktion. Vielmehr enthält das Package exportierte Funktionen und Variablen. Letztere können einfache Datentypen, aber auch Strukturen mit Methoden sein. Dies wird anschließend mit dem Befehl go build -buildmode=plugin übersetzt. Ergebnis ist die Library mit dem Names des Verzeichnisses, ganz entsprechend der Übersetzung von ausführbaren Programmen. Eine Datei foo/main.go wird also zur Datei foo/foo.so. Und wie auch bei Programmen, lässt sich hier mit dem Parameter -o ein alternativer Name setzen.Plug-ins entwickelnDie zu erfüllende Schnittstelle eines Plug-ins soll an dieser Stelle eine Variable Logger sein. Ihr Typ erfüllt ein Interfac...

Neugierig geworden?


   
Loading...

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang