Maison  >  Article  >  développement back-end  >  Pouvez-vous définir un type pour les appels de fonction dans Go ?

Pouvez-vous définir un type pour les appels de fonction dans Go ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-01 11:49:02526parcourir

Can You Define a Type for Function Calls in Go?

Est-il possible de définir un type pour les appels de fonction dans Go ?

Des mots-clés Go tels que go et defer attendent des appels de fonction en tant que paramètres. Existe-t-il un type dédié qui peut servir le même objectif, permettant aux fonctions de recevoir des appels de fonction comme arguments au lieu de fonctions ?

Aucun type direct pour les appels de fonction

Malheureusement, il n'existe pas de type de ce type dans Aller. Le comportement de go et defer est intégré à la spécification du langage et appliqué par le compilateur.

Utilisation des valeurs de fonction comme variables

Au lieu de cela, il est possible d'utiliser des valeurs de fonction comme variables ou valeurs. Celles-ci peuvent être appelées plus tard comme s'il s'agissait de fonctions normales.

<code class="go">func myFunc() {
    fmt.Println("hi")
}

func main() {
    var f func()
    f = myFunc
    f() // This calls the function value stored in f: myFunc in this example
}</code>

Imiter la sauvegarde automatique des paramètres

Dans certains cas, il est souhaitable d'avoir une sauvegarde automatique des paramètres pour les appels de fonction. Pour des types de fonctions spécifiques, cela peut être réalisé en introduisant des fonctions d'assistance avec des signatures identiques qui renvoient des fonctions sans paramètre. Ces fermetures appellent la fonction d'origine avec les paramètres enregistrés.

Utiliser la réflexion pour transmettre des fonctions

La réflexion peut être utilisée pour éviter la copie manuelle des paramètres. Cependant, cela implique de transmettre la fonction plutôt que de l'appeler, ce qui ralentit le processus.

Exception unique : valeurs de méthode

Il existe une exception lors de l'utilisation de méthodes. Les valeurs de méthode peuvent enregistrer une copie du récepteur, permettant ainsi l'enregistrement automatique des paramètres pour les appels de méthode.

<code class="go">type myParams struct {
    format string
    i int
    s string
}

func (mp myParams) Call() {
    fmt.Printf(mp.format, mp.i, mp.s)
}

func main() {
    p := myParams{format: "%d %q\n", i: 1, s: "Hello, playground"}
    launch(p.Call) // p is saved here
    p.i, p.s = 2, "changed"

    time.Sleep(time.Second)
}</code>

Remarque : Aucune de ces approches ne fournit une correspondance exacte pour la fonctionnalité souhaitée. Si les paramètres sont susceptibles de changer, une copie manuelle est nécessaire avant de transmettre la fonction à un assistant qui enregistre les paramètres.

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!

Déclaration:
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