Heim  >  Artikel  >  Backend-Entwicklung  >  Was ist der richtige Weg, um Go func in uintptr zu konvertieren?

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

王林
王林nach vorne
2024-02-09 13:10:081121Durchsuche

将 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))
}

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))
}
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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen