Heim >Backend-Entwicklung >Golang >Was ist der richtige Weg, um Go func in uintptr zu konvertieren?
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.
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)) }
Ich habe im Internet gesucht, aber diese Informationen sind bei Google nicht direkt zu sehen.
Vielen Dank.
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)) }
3 3 Process finished with the exit code 0
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!