2010-08-30 3 views
36

J'apprenais sur les pointeurs dans Google Go. Et réussi à écrire quelque chose comme,Pouvons-nous avoir des pointeurs de fonction dans Google Go?

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 le définir comme ci-dessus? Pouvons-nous écrire quelque chose comme nous le faisons en C?

par exemple. void (*pfunc)(void);

+5

Je ne sais pas assez sur Go pour répondre à votre question, mais j'ai counterquestion: pourquoi vous voulez avoir des pointeurs de fonction quand Go a des fonctions de première classe appropriées? –

+1

Je suppose que c'est plus une question d'éducation. J'ai une formation en C et je viens de commencer à apprendre sur Go. J'ai remarqué que Go a des pointeurs similaires à C et voulait donc savoir si les pointeurs de fonction sont possibles dans Go et si oui, comment les déclarer. – Kevin

Répondre

50

Cela fonctionne si vous utilisez la signature. Il n'y a pas de pointeur.

type HelloFunc func(string) 

func SayHello(to string) { 
    fmt.Printf("Hello, %s!\n", to) 
} 

func main() { 
    var hf HelloFunc 

    hf = SayHello 

    hf("world") 
} 

Vous pouvez également utiliser la signature de fonction directement, sans déclarer de nouveau type.

+0

Merci Mue pour expliquer l'utilisation du "type" pour les fonctions. – Kevin

23

Go n'a pas la même syntaxe pour les pointeurs de fonction que C et C++. Il y a une très bonne explication pour cela sur le Go blog. Naturellement, les auteurs de Go pensaient que la syntaxe de C pour les pointeurs de fonction était trop similaire à celle des pointeurs réguliers, donc ils ont décidé de rendre les pointeurs de fonction explicites; c'est-à-dire plus lisible.

Voici un exemple que j'ai écrit. Remarquez comment le paramètre fp est défini dans calculate() et l'autre exemple ci-dessous vous montre comment vous pouvez faire un pointeur de fonction dans un type et l'utiliser dans une fonction (la fonction commentée commentée).

package main 

import "fmt" 

type ArithOp func(int, int)int 

func main() { 
    calculate(Plus) 
    calculate(Minus) 
    calculate(Multiply) 
} 

func calculate(fp func(int, int)int) { 
    ans := fp(3,2) 
    fmt.Printf("\n%v\n", ans) 
} 

// This is the same function but uses the type/fp defined above 
// 
// func calculate (fp ArithOp) { 
//  ans := fp(3,2) 
//  fmt.Printf("\n%v\n", ans) 
// } 

func Plus(a, b int) int { 
    return a + b 
} 

func Minus(a, b int) int { 
    return a - b 
} 

func Multiply(a,b int) int { 
    return a * b 
} 

Le paramètre fp est défini comme étant une fonction qui prend deux ints et retourne un seul int. C'est quelque peu la même chose que Mue mentionné mais montre un exemple d'utilisation différent.

+0

Merci Hannson. – Kevin

+0

Je pense que vous avez mal lu cet article de blog. Il n'est pas dit que les pointeurs de fonction ne sont pas "autorisés", plutôt qu'ils ont une syntaxe de déclaration différente à C. – poolie

+0

Je n'étais pas mal lu; J'ai juste eu un mauvais choix de mots :) – hannson

4

Vous pouvez le faire comme ceci:

package main 

import "fmt" 

func hello(){ 

     fmt.Println("Hello World") 
} 

func main(){ 
     var pfunc func() 
     pfunc = hello  //pfunc is a pointer to the function "hello" 
     pfunc()    
} 

Si votre fonction a des arguments et par exemple une valeur de retour, il ressemblerait à ceci:

func hello(name string) int{ 

     fmt.Println("Hello %s", name) 
     return 0 
} 

et la variable ressemblerait à ceci:

var pfunc func(string)int 
Questions connexes