Was ist der richtige Weg, um Go func in uintptr zu konvertieren?

王林
Freigeben: 2024-02-09 13:10:08
nach vorne
1117 Leute haben es durchsucht

将 Go func 转换为 uintptr 的正确方法是什么?

In der Go-Sprache ist das Konvertieren eines „func“-Typs in einen „uintptr“-Typ ein häufiger Vorgang, aber die richtige Methode ist nicht die direkte Konvertierung, da dies zu potenziellen Problemen führen kann. Die richtige Methode besteht darin, die Funktion „Pointer“ im Paket „unsafe“ zu verwenden, um den Wert vom Typ „func“ zuerst in den Typ „unsafe.Pointer“ und dann in den Typ „uintptr“ zu konvertieren. Dies gewährleistet die Sicherheit der Typkonvertierung und vermeidet unvorhersehbare Fehler. Obwohl diese Methode die Verwendung des Pakets „unsafe“ erfordert, kann sie unter den richtigen Umständen das Problem der Konvertierung von „Go func“ in „uintptr“ effektiv lösen.

Frageninhalt

Ich muss Go-Funktionen im Go-Code übergeben und empfangen.

Aufgrund der Funktionsweise von Systemaufrufen in der Go-Sprache wird für „Passage“ der Typ uintptr verwendet.

Ich habe keine andere Wahl als uintptr 之外我别无选择,因为 syscall.syscalln, da syscall.syscalln diesen Typ akzeptiert und zurückgibt.

Was ist der richtige Weg, um go func in func 转换为 uintptr zu konvertieren?

Ich habe versucht, es in der Sandbox zu verwenden, aber ich kann es nicht einfach konvertieren.

package main

import (
    "fmt"
    "unsafe"
)

func main() {
    var f MyFunc = SumInt
    fmt.Println(f(1, 2))
    test(uintptr(f))                 // Cannot convert an expression of the type 'MyFunc' to the type 'uintptr'
    test(uintptr(unsafe.Pointer(f))) // Cannot convert an expression of the type 'MyFunc' to the type 'unsafe.Pointer'
}

type MyFunc func(a int, b int) (sum int)

func SumInt(a, b int) int {
    return a + b
}

func test(x uintptr) {
    var xf MyFunc
    xf = MyFunc(x)                 // Cannot convert an expression of the type 'uintptr' to the type 'MyFunc'
    xf = MyFunc(unsafe.Pointer(x)) // Cannot convert an expression of the type 'unsafe.Pointer' to the type 'MyFunc'
    fmt.Println(xf(1, 2))
}
Nach dem Login kopieren

Ich habe im Internet gesucht, aber diese Informationen sind bei Google nicht direkt zu sehen.

Vielen Dank.

Lösung

Ich habe eine Lösung gefunden! Ich muss einen Funktionszeiger übergeben.

package main

import (
    "fmt"
    "unsafe"
)

func main() {
    var f myfunc = sumint
    fmt.println(f(1, 2))
    test(uintptr(unsafe.pointer(&f)))
}

type myfunc func(a int, b int) (sum int)

func sumint(a, b int) int {
    return a + b
}

func test(x uintptr) {
    var xfp *myfunc
    xfp = (*myfunc)(unsafe.pointer(x))

    var xf myfunc
    xf = *xfp
    fmt.println(xf(1, 2))
}
Nach dem Login kopieren
3
3

Process finished with the exit code 0
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWas ist der richtige Weg, um Go func in uintptr zu konvertieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!