Maison >développement back-end >Golang >Quelle est la bonne façon de convertir Go func en uintptr ?
Dans le langage Go, la conversion d'un type `func` en type `uintptr` est une opération courante, mais la méthode correcte n'est pas de convertir directement, car cela peut causer des problèmes potentiels. La méthode correcte consiste à utiliser la fonction « Pointer » dans le package « unsafe » pour convertir d'abord la valeur du type « func » en type « unsafe.Pointer », puis à la convertir en type « uintptr ». Cela garantit la sécurité de la conversion de type et évite les erreurs imprévisibles. Bien que cette méthode nécessite l'utilisation du package « unsafe », dans de bonnes circonstances, elle peut résoudre efficacement le problème de la conversion de « Go func » en « uintptr ».
Je dois transmettre et recevoir les fonctions go dans le code go.
En raison du fonctionnement des appels système dans le langage go, le type utilisé pour "passage" est uintptr
.
Je n'ai pas d'autre choix que uintptr
之外我别无选择,因为 syscall.syscalln
puisque syscall.syscalln
accepte et renvoie ce type.
Quelle est la bonne façon de convertir go func
en func
转换为 uintptr
?
J'ai essayé de l'utiliser dans un bac à sable mais je ne peux pas simplement le convertir.
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)) }
J'ai cherché sur Internet mais cette information n'est pas visible directement dans Google.
Merci.
J'ai trouvé une solution ! Je dois passer un pointeur de fonction.
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
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!