Peut-on avoir des pointeurs de fonction en Aller?
J'apprenais sur les pointeurs en Aller. Et a réussi à écrire quelque chose comme:
func hello(){
fmt.Println("Hello World")
}
func main(){
pfunc := hello //pfunc is a pointer to the function "hello"
pfunc() //calling pfunc prints "Hello World" similar to hello function
}
Est-il un moyen de déclarer le pointeur de fonction sans la définir comme fait ci-dessus?
Peut-on écrire quelque chose comme nous le faire en C?
par exemple void (*pfunc)(void);
- Je ne sais pas assez sur vais répondre à votre question, mais j'ai un counterquestion: pourquoi voudriez-vous avoir des pointeurs de fonction quand Aller a la bonne première classe de fonctions?
- Je suppose que c'est plus une question éducation. J'ai une formation en C et juste commencé à apprendre à propos de Go. J'ai remarqué que Aller a des pointeurs similaire à C et ainsi voulu savoir si des pointeurs de fonction sont possibles en Aller et si oui, comment la déclarer.
Vous devez vous connecter pour publier un commentaire.
Cela fonctionne si vous êtes en utilisant la signature. Il n'y a pas de pointeur.
Alternativement, vous pouvez utiliser la fonction de signature directement, sans déclarer un nouveau type.
Aller n'ont pas la même syntaxe pour les pointeurs de fonction comme le C et le C++ n'. Il y a une très bonne explication pour que, sur la Allez blog. Naturellement les Aller auteurs ont pensé que C est la syntaxe pour les pointeurs de fonction trop comme pour les pointeurs, donc en bref, ils ont décidé de faire des pointeurs de fonction explicite; c'est à dire plus lisible.
Voici un exemple que j'ai écrit. Remarquez comment le
fp
paramètre est défini danscalculate()
et l'autre exemple ci-dessous qui vous montre comment vous pouvez faire un pointeur de fonction dans un type et de l'utiliser dans une fonction (le commentaire de calculer la fonction).La
fp
paramètre est défini comme une fonction qui prend deux entiers et renvoie un seul int. C'est un peu la même chose Mue mentionné, mais montre un autre exemple d'utilisation.Vous pourriez le faire comme ceci:
Si votre fonction a des arguments et, par exemple, une valeur de retour, il ressemblerait à:
et la variable ressemblerait à:
Une autre approche consiste à définir une interface
mettre en œuvre une structure qui met en œuvre
Créer une carte qui contient la structure
l'appel de la fonction
C'est un peu indirecte, mais il fonctionne
type Delete string
et ensuite définir votre interface sur ce nouveau type. Puisstring
àDelete
est juste un type cast:Delete("new")
. Et vice-versa.