Einführung
Go 1.6 führte Änderungen ein zu den Regeln für die Übergabe von Zeigern an C-Code über cgo. Dadurch sind bisher praktikable Methoden zum Aufruf dynamischer Go-Callbacks aus C-Code nicht mehr funktionsfähig. In diesem Artikel werden die aktualisierten Richtlinien untersucht und gezeigt, wie Funktionszeiger effektiv an C-Code im aktuellen Go-Ökosystem übergeben werden.
Übergabe von Funktionszeigern in Go 1.6
Beginnend mit Go 1.6 gilt die folgende Regel:
Go-Code darf einen Go-Zeiger an C übergeben, sofern der Go-Speicher, auf den er zeigt, keine Go-Zeiger enthält.
Diese Einschränkung ergibt sich aus Laufzeitprüfungen Diese überwachen Verstöße und provozieren Abstürze, wenn sie erkannt werden. Durch das Setzen der Umgebungsvariablen GODEBUG=cgocheck=0 werden diese Prüfungen vorübergehend deaktiviert, ihre Entfernung in zukünftigen Go-Versionen ist jedoch möglich.
Konsequenzen und Lösungen
Die neue Regel verbietet das Bestehen Zeiger auf C-Code, wenn der Speicher, auf den verwiesen wird, Go-Funktions-/Methodenzeiger enthält. Es gibt mehrere Ansätze, um diese Einschränkung zu umgehen:
Synchronisierung und ID-Korrespondenz
Eine Strategie besteht darin, eine synchronisierte Datenstruktur aufrechtzuerhalten, die IDs tatsächlichen Zeigern zuordnet. Durch die Übergabe von IDs an C-Code anstelle von direkten Zeigern können Sie die Einschränkung umgehen und dennoch die gewünschte Funktionalität erreichen.
Beispielcode
Der folgende Codeausschnitt veranschaulicht, wie das geht Implementieren Sie diesen Ansatz:
<code class="go">import ( "fmt" "sync" ) var mu sync.Mutex var index int var fns = make(map[int]func(C.int)) func register(fn func(C.int)) int { mu.Lock() defer mu.Unlock() index++ for fns[index] != nil { index++ } fns[index] = fn return index } func lookup(i int) func(C.int) { mu.Lock() defer mu.Unlock() return fns[i] }</code>
Dieser Code definiert ein Registrierungssystem, das Go-Funktionen eindeutige IDs zuweist und die Zuordnungen threadsicher speichert. Beim Aufruf von C-Code können Sie die ID anstelle des Funktionszeigers direkt übergeben.
Fazit
Die Änderungen in Go 1.6 erfordern sorgfältige Überlegungen bei der Übergabe von Funktionszeigern an C Code. Durch die Einführung von Synchronisierungstechniken wie der oben vorgestellten können Sie die neuen Einschränkungen effektiv überwinden und die Kompatibilität mit den neuesten Versionen von Go sicherstellen.
Das obige ist der detaillierte Inhalt vonWie kann ich angesichts der neuen Einschränkungen Funktionszeiger an C-Code in Go 1.6 übergeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!