Golang: pointeur vers la fonction de chaîne de caractères (nom de la fonction)
Est-il une chance d'obtenir le pointeur de fonction à partir de la fonction du nom, présenté comme une chaîne de caractères? Ce qui est nécessaire par exemple pour envoyer une fonction comme argument d'une autre fonction. Une sorte de métaprogrammation, vous savez.
Merci!
Vous devez vous connecter pour publier un commentaire.
Aller les fonctions sont de première classe, des valeurs. Vous n'avez pas besoin de retourner à la des astuces des langages dynamiques.
Aire de jeux
De sortie:
Si la sélection de la fonction dépend de certains au moment de l'exécution seule valeur connue, vous pouvez utiliser une carte:
"foo"
), passez à la fonction de l'identificateur entre guillemets. Les deux techniques sont indiquées ci-dessus. Ou je n'ai pas ce que tu veux dire, peut-être?"f" : f
qui est un peu absurde.La accepté de répondre à réponse est probablement ce que vous devez faire.
Ici est une approche à l'aide de réflexion qui permet de passer un flexible certain nombre d'arguments aussi bien. Actuellement, il nécessite la construction d'une liste (map) des fonctions prises en charge manuellement (voir
main
méthode), mais cela peut être amélioré.Inspiration/source
Je ne suis pas tout à fait clair sur ce que vous êtes désireux de le faire. La accepté de répondre à devrait couvrir les fondements de ce que vous essayez de faire.
Je voudrais ajouter que la
crypto
paquet a une façon intéressante de l'indirectement l'enregistrement d'autres paquets. Spécialement prendre un coup d'oeil à crypto.aller.Essentiellement la façon dont cela fonctionne est la
crypto
paquet a une carte vide comme ceci:Où "clé" serait un unique type (int, string, etc..) et la valeur serait le prototype de fonction vous êtes enceinte.
Un paquet, puis de l'enregistrer lui-même à l'aide de la fonction init:
Le paquet lui-même serait inclus à l'aide de
import _ "path/to/package"
.Et puis le maître aurait un moyen de récupérer cette fonction.
Avec
crypto
, vous pouvez utiliser sha 256 comme ceci:Mais vous devez d'abord l'inclure dans votre main comme ceci:
Espérons que cette aide.
Si la fonction est une "Méthode", vous pouvez utiliser réfléchir.De la valeur.MethodByName
voir refléter la documentation ici