Maison  >  Article  >  développement back-end  >  Pouvez-vous transmettre des appels de fonction comme arguments dans Go ?

Pouvez-vous transmettre des appels de fonction comme arguments dans Go ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-29 15:43:021087parcourir

Can you Pass Function Calls as Arguments in Go?

Obtenir un comportement de type appel de fonction dans Go

Dans Go, des mots-clés comme go et defer s'attendent à ce que les fonctions soient transmises en tant que paramètres. Cependant, il existe une limitation qui empêche de passer des appels de fonction réels.

Réponse :

Malheureusement, il n'existe pas de type direct qui vous permette d'imiter les appels de fonction en tant qu'arguments. go et defer sont des constructions syntaxiques soutenues par la spécification du langage, et le compilateur applique ce comportement.

Approche alternative : utilisation des valeurs de fonction

Pour contourner cette limitation, vous pouvez utiliser des valeurs de fonction. Une valeur de fonction est une variable ou une valeur de type fonction. Vous pouvez appeler les valeurs de fonction plus tard ou à tout moment lorsque cela est nécessaire.

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

func main() {
    var f func()
    f = myFunc
    f() // This calls the function value stored in f, which is myFunc in this case
}</code>

Émulation de la sauvegarde automatique des paramètres

Dans les commentaires, vous avez mentionné le souhait d'une sauvegarde automatique des paramètres . Voici comment vous pouvez y parvenir à l'aide d'une fonction d'assistance qui fournit une fonction encapsulée avec des paramètres enregistrés :

<code class="go">func wrapPrintln(s string) func() {
    return func() {
        fmt.Println(s)
    }
}

func launch(f func()) {
    fmt.Println("Before launch")
    go func() {
        defer fmt.Println("After completion")
        f()
    }()
}

func main() {
    s := "Hello, playground"
    launch(wrapPrintln(s))
}</code>

La réflexion en option

La réflexion est une autre approche pour gérer ce scénario, mais cela implique de passer la fonction comme interface et d'utiliser la réflexion pour l'appeler. Cette approche est moins efficace que l'utilisation de valeurs de fonction mais permet de gérer des fonctions avec des signatures variables.

En conclusion, bien qu'il n'existe pas de moyen direct de passer des appels de fonction comme arguments, en utilisant des valeurs de fonction ou en imitant la sauvegarde des paramètres via l'assistant les fonctions fournissent une solution de contournement pour obtenir un comportement similaire.

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