2016-04-04 8 views
6

Ich bin im Begriff, eine Bibliothek zu entwickeln, die es in Go und zusammengestellt auf ein C shared library so geschrieben werden kann durch Sprachen wie Python, Node.JS, Java und RubyGo c-Shared Library Rückruf in andere Sprachen

genannt werden

Ich habe gerade festgestellt, dass es ein Problem gibt, wenn es um Rückrufe geht. Wie kann ich in den Anrufcode zurückrufen, der mindestens eine der oben genannten Sprachen ist? Gibt es einen einzigen Weg, den ich machen kann, oder muss ich etwas Spezifisches auf der Go-Seite für jede Sprache implementieren?

Update für Klarheit:

Ich bin bereits in der Lage Go als eine Bibliothek zu bauen und den Code aus anderen Sprachen wie Java und Python ausführen.

Meine Frage bezieht sich speziell auf eine Situation, in der go etwas asynchron ausführt und in den Aufrufer (d. H. Java, Python) zurückrufen muss.

Antwort

3

Die Lingua Franca der Schnittstelle zwischen verschiedenen Programmiersprachen ist C zu durchlaufen. Sie können etwas wie cgo verwenden, um Ihren Go-Code über C zugänglich zu machen, dann verwenden Sie die C oder "native" Bindungen in Python, Java, etc Rufen Sie es auf.

Normalerweise gehen Entwickler nur bei großen und gut gewarteten Projekten durch. Wenn Sie ein persönliches Projekt haben und Leistung weniger wichtig ist, würde ich vorschlagen, über json (für Websprachen) oder stdout/stderr pipes zu kommunizieren (wahrscheinlich mehr, was Sie wollen). Sie können Befehle aus Ruby in stdout drucken und Ihren Go-Code verarbeiten lassen, um die Anforderung zu verarbeiten und auf der Standardausgabe zu berichten. Es ist normalerweise möglich, obwohl es manchmal schwierig ist, sowohl Eingang als auch Ausgang zu einem anderen Programm zu leiten. CGI-Programme funktionieren auf diese Weise, erzeugen Interpreter für andere Sprachen und leiten Daten an diesen Interpreter weiter.

Update: Der Aufruf von Java/Python/was auch immer Sprache Runtime von Go ist schwierig, wenn Sie Objekte übergeben möchten; Ich stelle mir vor, dass dies in Abhängigkeit von der verbindlichen API (Java, Python) anders gestaltet werden muss. Vielleicht haben Sie dieses Problem bereits gelöst, wenn Sie die Bindungen an Ort und Stelle haben? Es könnte einfacher sein, wenn Sie keine Parameter an den Rückruf übergeben (d. H. Es ist im Grunde ein Timer-Rückruf). Minimieren Sie die Daten, die in Go generiert und in der anderen Sprache gelesen werden müssen.

+0

Bitte Update posten. Ich kann die Bibliothek bereits kompilieren und von Java aus aufrufen, aber ich brauche einen Callback-Mechanismus. – conor

+0

Verfügen Sie bereits über alle systemeigenen APIs für diese Sprachen? Wenn Sie dies tun, wird wahrscheinlich klar sein, wie ein Rückruf aufgerufen wird. – dwks

+0

Nein, ich habe nichts wirklich anderes als PoC-Bibliotheken entwickelt. Das heißt, ich werde die verbindlichen Rahmen betrachten und sehen, was sie an Ort und Stelle haben. Ich plane die Verwendung von JSON, um Komplexität zu minimieren. – conor

2

Nun, dies wird eine meist Link-only-Antwort, aber seit Go 1.5 können Sie gemeinsam genutzte Bibliotheken, die Sie von C aufrufen können, oder jede Sprache, die das unterstützt (aka Python, Ruby, PHP usw.)

http://blog.ralch.com/tutorial/golang-sharing-libraries/

  • dies nicht meine Verbindung ist, habe ich folgte ihm kurz vor einer Dummy-python-Test zu machen.
+1

Ich denke, das OP fragt nach Rückrufen in andere Sprachen? Zum Beispiel, wenn wir doSomethingJava() haben, was in Java geschrieben ist, wie kann man es von Go aus aufrufen? Zugänglich machen für den Go-Code. Wenn Sie c-shared-Bibliotheken verwenden, kann Java auf Go zugreifen, aber wenn es einen Rückruf in Java-Code gibt, wie kann man ihn über den Go-Code aufrufen? –

+0

@ a3.14_Infinity Hmm, es würde wahrscheinlich genauso funktionieren, wie Sie es mit einer C-Bibliothek tun können, aber ich bin nicht 100% sicher, wie. – OneOfOne

+0

@ a3.14_Infinity Ja, du hast Recht :) – conor

Verwandte Themen