Warum Go keine Insel, sondern eine Brücke ist
\n\nGo ist eine bemerkenswerte Sprache. Sie ist schnell, kompiliert und hat eine hervorragende Standardbibliothek. Aber seien wir ehrlich: In der realen Welt schreiben wir selten alles von Grund auf in einer einzigen Sprache. Sie haben eine alte, bewährte Bibliothek in C, die es schade wäre, neu zu schreiben. Oder ein cooles Python-Skript für maschinelles Lernen. Oder Sie möchten Go-Logik direkt im Browser ausführen.
\nUnd dann stellt sich die Frage: Wie integriert man Go mit anderen Sprachen? Keine Sorge, Go wurde speziell als guter «Nachbar» konzipiert. In diesem Artikel auf PythonLib werden wir die drei wichtigsten Methoden durchgehen, um Ihr Go-Programm mit fremdem Code zu verbinden. Sie erfahren, wie cgo funktioniert, wie Sie Python-Funktionen über Systemaufrufe ansprechen und sogar, wie Sie Go in WebAssembly kompilieren.
Go-Integration mit C über cgo: Der Klassiker
\n\nDer direkteste und leistungsfähigste Weg ist cgo. Es ist keine Bibliothek, sondern ein eingebauter Mechanismus von Go, der es Ihrem Code ermöglicht, C-Funktionen direkt aufzurufen. Wie funktioniert das? Sie schreiben einfach den Import "C" und davor einen Kommentar mit C-Code. Der Go-Compiler fügt alles zusammen.
Unser erstes Programm mit cgo schreiben
\n\nSchreiben wir ein einfaches Beispiel: Wir rufen die Standard-printf aus C auf. Erstellen Sie eine Datei main.go:
package main\n\n/*\n#include <stdio.h>\n#include <stdlib.h>\n\nvoid hello_cgo(const char* name) {\n printf("Hallo aus C, %s!\\n", name);\n}\n*/\nimport "C"\nimport "unsafe"\n\nfunc main() {\n name := C.CString("Gopher")\n defer C.free(unsafe.Pointer(name))\n C.hello_cgo(name)\n}\n\n\nStarten Sie es: go run main.go. Wenn GCC (oder MinGW unter Windows) installiert ist, wird alles kompiliert. Sie sehen «Hallo aus C, Gopher!». Magie!
Wichtig: C.CString reserviert Speicher im C-Heap, daher müssen wir ihn über C.free freigeben. Sonst gibt es ein Speicherleck. Cgo erfordert Disziplin von Ihnen.
Komplexe Typen übergeben: Strukturen
\n\nOft muss man nicht mit Strings, sondern mit Strukturen arbeiten. Angenommen, wir haben eine C-Bibliothek für die Arbeit mit Matrizen. Wir möchten eine Go-Struktur an sie übergeben. Machen wir das:
\n\npackage main\n\n/*\ntypedef struct {\n int x;\n int y;\n int result;\n} Point;\n\nPoint add_points(Point a, Point b) {\n Point r;\n r.x = a.x + b.x;\n r.y = a.y + b.y;\n r.result = r.x + r.y;\n return r;\n}\n*/\nimport "C"\nimport "fmt"\n\ntype GoPoint struct {\n X, Y, Result int\n}\n\nfunc main() {\n a := C.Point{x: 10, y: 20}\n b := C.Point{x: 30, y: 40}\n r := C.add_points(a, b)\n\n goPoint := GoPoint{\n X: int(r.x),\n Y: int(r.y),\n Result: int(r.result),\n }\n fmt.Printf("Go hat erhalten: Point{X:%d, Y:%d, Result:%d}\\n", goPoint.X, goPoint.Y, goPoint.Result)\n}\n\n\nBeachten Sie: Wir konvertieren C-Typen explizit in Go-Typen. Cgo kann Strukturen nicht automatisch abbilden, daher sind Sie immer für die Konvertierung verantwortlich. Dies ist einer der Hauptkompromisse der Go-Integration mit der Sprache C.
\n\nWann cgo nicht nötig ist
\nVerwenden Sie cgo nicht, wenn:
\n- \n
- Sie nur einen Befehl im Terminal aufrufen müssen – verwenden Sie
os/exec. \n - Sie plattformübergreifenden Code schreiben – cgo erschwert den Build. \n
- Die Leistung nicht kritisch ist – cgo fügt Overhead durch Kontextwechsel hinzu. \n
Go-Integration mit Python: Clever skripten
\n\nPython und Go sind ein großartiges Paar. Go für Geschwindigkeit und Parallelität, Python für Flexibilität und Ökosystem (NumPy, TensorFlow). Wie bringt man sie zusammen? Wir haben zwei Ansätze: den «schweren» (über cgo und die Python C API) und den «leichten» (über Unterprozesse).
\n\nMethode 1: Python über os/exec aufrufen (einfach und zuverlässig)
\n\nDer sicherste Weg für die Bildung ist, ein Python-Skript als separaten