


Wie kann ich mit CGO in Go-Versionen 1.6 und höher Funktionszeiger an C-Code übergeben?
Übergabe von Funktionszeigern an C-Code mit CGO
Einführung
In Go-Versionen vor 1.6 war die Übergabe von Funktionszeigern an C-Code mithilfe von CGO unkompliziert. Mit der Einführung neuer Regeln in Go 1.6 ist diese Praxis jedoch komplexer geworden.
Das Problem
Der Kern des Problems liegt in den aktualisierten CGO-Regeln , die festlegen, dass Go-Code Go-Zeiger nur dann an C übergeben kann, wenn der Speicher, auf den sie verweisen, keine anderen Go-Zeiger enthält. Dies führt zu einem Problem, da Funktionszeiger im Go-Speicher gespeichert sind, die möglicherweise andere Go-Zeiger enthalten.
Mögliche Lösungen
Es wurden mehrere Ansätze entwickelt, um dieses Problem anzugehen. Eine gängige Lösung besteht darin, ganz auf die Verwendung direkter Funktionszeiger zu verzichten. Erstellen Sie stattdessen eine synchronisierte Datenstruktur, die IDs (Ganzzahlen) den tatsächlichen Funktionszeigern zuordnet. Dadurch können Sie die ID anstelle des Zeigers selbst an den C-Code übergeben.
Beispielimplementierung
Der folgende Codeausschnitt zeigt, wie dieser Ansatz implementiert wird:
<code class="golang">package gocallback import ( "fmt" "sync" ) type Callback func(C.int) var mu sync.Mutex var index int var fns = make(map[int]Callback) func register(fn Callback) int { mu.Lock() defer mu.Unlock() index++ for fns[index] != nil { index++ } fns[index] = fn return index } func lookup(i int) Callback { mu.Lock() defer mu.Unlock() return fns[i] } func unregister(i int) { mu.Lock() defer mu.Unlock() delete(fns, i) }</code>
Verwendung in C-Code
Once the Go Wenn die Datenstruktur vorhanden ist, können Sie den Go-Rückruf vom C-Code aus aufrufen, indem Sie die ID und nicht den Funktionszeiger selbst übergeben. Zum Beispiel:
<code class="c">extern void go_callback_int(int foo, int p1); static inline void CallMyFunction(int foo) { go_callback_int(foo, 5); }</code>
Fazit
Während die neuen CGO-Regeln den Prozess der Übergabe von Funktionszeigern an C-Code etwas komplexer machen, sind es die in diesem Artikel beschriebenen Ansätze Wirksame Lösungen anbieten. Durch die Nutzung synchronisierter Datenstrukturen und IDs können Sie weiterhin die Vorteile der Schnittstelle zwischen Go- und C-Code nutzen und gleichzeitig die neuesten CGO-Vorschriften einhalten.
Das obige ist der detaillierte Inhalt vonWie kann ich mit CGO in Go-Versionen 1.6 und höher Funktionszeiger an C-Code übergeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen











Golang ist in Bezug auf Leistung und Skalierbarkeit besser als Python. 1) Golangs Kompilierungseigenschaften und effizientes Parallelitätsmodell machen es in hohen Parallelitätsszenarien gut ab. 2) Python wird als interpretierte Sprache langsam ausgeführt, kann aber die Leistung durch Tools wie Cython optimieren.

Golang ist in Gleichzeitigkeit besser als C, während C bei Rohgeschwindigkeit besser als Golang ist. 1) Golang erreicht durch Goroutine und Kanal eine effiziente Parallelität, die zum Umgang mit einer großen Anzahl von gleichzeitigen Aufgaben geeignet ist. 2) C über Compiler -Optimierung und Standardbibliothek bietet es eine hohe Leistung in der Nähe der Hardware, die für Anwendungen geeignet ist, die eine extreme Optimierung erfordern.

GoisidealforBeginersandSuitableforCloudandNetWorkServicesDuetoitsSimplicity, Effizienz und Konsumfeaturen.1) InstallgoFromTheofficialwebSiteAnDverifyWith'goversion'.2) CreateAneDrunyourFirstProgramwith'gorunhello.go.go.go.

Golang ist für schnelle Entwicklung und gleichzeitige Szenarien geeignet, und C ist für Szenarien geeignet, in denen extreme Leistung und Kontrolle auf niedriger Ebene erforderlich sind. 1) Golang verbessert die Leistung durch Müllsammlung und Parallelitätsmechanismen und eignet sich für die Entwicklung von Webdiensten mit hoher Konsequenz. 2) C erreicht die endgültige Leistung durch das manuelle Speicherverwaltung und die Compiler -Optimierung und eignet sich für eingebettete Systementwicklung.

Golang und Python haben jeweils ihre eigenen Vorteile: Golang ist für hohe Leistung und gleichzeitige Programmierung geeignet, während Python für Datenwissenschaft und Webentwicklung geeignet ist. Golang ist bekannt für sein Parallelitätsmodell und seine effiziente Leistung, während Python für sein Ökosystem für die kurze Syntax und sein reiches Bibliothek bekannt ist.

Die Leistungsunterschiede zwischen Golang und C spiegeln sich hauptsächlich in der Speicherverwaltung, der Kompilierungsoptimierung und der Laufzeiteffizienz wider. 1) Golangs Müllsammlung Mechanismus ist praktisch, kann jedoch die Leistung beeinflussen.

Golang und C haben jeweils ihre eigenen Vorteile bei Leistungswettbewerben: 1) Golang ist für eine hohe Parallelität und schnelle Entwicklung geeignet, und 2) C bietet eine höhere Leistung und eine feinkörnige Kontrolle. Die Auswahl sollte auf Projektanforderungen und Teamtechnologie -Stack basieren.

GolangissidealforbuildingsCalablesSystemduetoitseffizienz und Konsumverkehr, whilepythonexcelsinquickScriptingandDataanalyseduetoitssimplication und VacevastEcosystem.golangsDesineScouragesCouragescournations, tadelcodedeanDitsGoroutaTinoutgoroutaTinoutgoroutaTinoutsGoroutinesGoroutinesGoroutsGoroutins, t
