54 votes

Pouvons-nous avoir des pointeurs de fonction dans Go ?

J'apprenais les pointeurs dans Go. Et j'ai 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
}

Existe-t-il un moyen de déclarer le pointeur de fonction sans le définir comme indiqué ci-dessus ? Pouvons-nous écrire quelque chose comme nous le faisons en C ?

par exemple void (*pfunc)(void);

74voto

Mue Points 2469

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")
}

Alternativement, vous pouvez utiliser la signature de fonction directement, sans déclarer un nouveau type.

9voto

Une fonction est aussi un type dans Go. Vous pouvez donc essentiellement créer une variable de type func signature. Donc, ce qui suit fonctionnerait ;

 var pfunc func(string)

Cette variable peut pointer vers n'importe quelle fonction qui prend une chaîne comme argument et ne renvoie rien. Le morceau de code suivant fonctionne bien.

 package main

import "fmt"

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

func main() {
    var pfunc func(string)

    pfunc = SayHello

    pfunc("world")
}

5voto

nos Points 102226

Tu pourrais 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, cela ressemblerait à :

 func hello(name string) int{

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

et la variable ressemblerait à :

   var pfunc func(string)int

0voto

Don Newton Points 11

Une façon différente de l'aborder est de définir une interface

 type command interface {
      DoLoop()
}

implémenter une structure qui l'implémente

 type Delete struct {
      instance string
}

func (dev Delete) DoLoop() {
      fmt.Println("input: delete ")
}

Créer une carte qui contient la structure

  mainFuncTable = make(map[string]command)
 mainFuncTable["delete"] = Delete{"new"}

l'appel la fonction

 func route(command string) {
      cmd := mainFuncTable[command]
      cmd.DoLoop()
}

C'est un peu indirect mais ça marche

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X