Maison >développement back-end >Golang >Quelle est la bonne façon de convertir Go func en uintptr ?

Quelle est la bonne façon de convertir Go func en uintptr ?

王林
王林avant
2024-02-09 13:10:081165parcourir

将 Go func 转换为 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 ».

Contenu de la question

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.

Solution

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer