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 ?

王林
Libérer: 2024-02-09 13:10:08
avant
1168 Les gens l'ont consulté

将 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))
}
Copier après la connexion

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))
}
Copier après la connexion
3
3

Process finished with the exit code 0
Copier après la connexion

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!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal