Passer des fonctions en Go : du débutant au pro en 15 minutes

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Peut-on passer une fonction comme paramètre ? Oui, et voici pourquoi cela change tout

\n\n

Avez-vous déjà pensé à la possibilité de passer une fonction dans une autre en Go, comme une variable ordinaire ? Si vous venez du monde Python ou JavaScript, c'est un modèle habituel pour vous. Mais en Go, malgré toute sa rigueur, les fonctions comme paramètres — ce n'est pas seulement "possible", c'est l'un des outils les plus puissants du langage.

\n\n

Je me souviens de ma première rencontre avec ce concept : j'écrivais un utilitaire pour traiter des logs et j'ai réalisé que je copiais-collais la même boucle avec une logique différente à l'intérieur. La solution est venue quand j'ai compris que je pouvais simplement passer la fonction souhaitée comme argument. Le code est devenu plus propre, plus court et plus compréhensible. Dans cet article, je vais vous montrer comment maîtriser le passage de fonction dans une fonction Go — des exemples simples aux modèles réels que vous pourrez utiliser demain au travail.

\n\n

D'ailleurs, sur PythonLib, nous voyons souvent des questions comme "Can functions be passed as parameters?" sur Stack Overflow avec des milliers de vues. Démêlons une fois pour toutes ce sujet avec l'exemple de Go.

\n\n

Que sont les fonctions comme paramètres en Go ?

\n\n

En Go, les fonctions sont des objets de première classe. Cela signifie qu'on peut :

\n
    \n
  • Les assigner à des variables
  • \n
  • Les passer à d'autres fonctions
  • \n
  • Les retourner depuis des fonctions
  • \n
  • Les stocker dans des structures et des slices
  • \n
\n\n

Lorsque nous parlons de fonction comme paramètre, nous entendons qu'une fonction en accepte une autre comme argument et l'appelle à l'intérieur d'elle-même. Cela semble compliqué ? En réalité, c'est plus simple qu'il n'y paraît.

\n\n

Syntaxe : comment déclarer une fonction qui accepte une autre fonction

\n\n

En Go, il faut indiquer explicitement le type de la fonction-paramètre. Cela ressemble à ceci :

\n\n
// Déclaration du type de fonction\ntype Transformer func(string) string\n\n// Fonction qui accepte une autre fonction\nfunc processText(text string, transform Transformer) string {\n    return transform(text)\n}
\n\n

Ou on peut déclarer le type directement dans la signature :

\n\n
func processText(text string, transform func(string) string) string {\n    return transform(text)\n}
\n\n

Les deux options fonctionnent. La première est plus pratique si vous prévoyez de réutiliser le type. La seconde, pour des solutions rapides.

\n\n

Exemple simple : passer une fonction de salutation

\n\n

Écrivons quelque chose de concret. Imaginez que vous ayez une fonction qui formate le nom d'un utilisateur, et que vous souhaitiez insérer différentes salutations :

\n\n
package main\n\nimport "fmt"\n\n// Type pour la fonction de salutation\ntype Greeter func(name string) string\n\n// Fonction qui accepte une salutation\nfunc greetUser(name string, greeter Greeter) {\n    message := greeter(name)\n    fmt.Println(message)\n}\n\nfunc main() {\n    // Salutation normale\n    normalGreet := func(name string) string {\n        return "Bonjour, " + name + " !"\n    }\n\n    // Salutation formelle\n    formalGreet := func(name string) string {\n        return "Cher(ère) " + name + ", bonjour."\n    }\n\n    greetUser("Anna", normalGreet)\n    greetUser("Anna", formalGreet)\n}
\n\n

Sortie :

\n
Bonjour, Anna !\nCher(ère) Anna, bonjour.
\n\n

Vous voyez ? Nous avons simplement passé différentes fonctions à la même greetUser. C'est cela, le passage de fonction comme argument en action.

\n\n

Fonctions callback : quand traiter le résultat

\n\n

L'un des scénarios les plus courants d'utilisation des fonctions comme paramètres est celui des callbacks. Vous effectuez une opération et appelez la fonction passée une fois l'opération terminée.

\n\n
package main\n\nimport (\n    "fmt"\n    "time"\n)\n\n// Fonction qui simule un long chargement de données\nfunc fetchData(callback func(string)) {\n    fmt.Println("Chargement des données...")\n    time.Sleep(2 * time.Second) // Simulation d'un délai\n    data := "Données importantes de la base"\n    callback(data)                

Blogs

Book Recommendations