« Où sont mes paramètres optionnels ? » — le cri du cœur du développeur Go
Vous venez de passer à Go depuis Python ou JavaScript et vous écrivez une fonction pour envoyer un email. En Python, cela ressemblerait à ceci :
def send_email(to, subject, cc=None, bcc=None, attachments=None): passTout est simple : cc, bcc et attachments sont des paramètres optionnels. On peut ne pas les transmettre, et la fonction fonctionnera avec les valeurs par défaut.
Mais voilà le problème : en Go, il n'y a pas de surcharge de méthodes ni d'arguments nommés avec des valeurs par défaut. La communauté Stack Overflow le confirme : la question « Optional Parameters in Go? » cumule des milliers de vues. C'est une vraie difficulté pour les débutants.
Bonne nouvelle : il existe au moins 5 façons élégantes de résoudre ce problème en Go. Dans cet article, nous allons toutes les analyser — des plus simples aux plus professionnelles.
Pourquoi Go est-il si « strict » ?
L'équipe Go a délibérément renoncé aux paramètres optionnels pour :
- Simplifier la lecture du code — vous voyez toujours combien d'arguments sont passés à une fonction.
- Éviter les comportements magiques — pas de valeurs par défaut inattendues.
- Accélérer la compilation — moins de sucre syntaxique.
Mais cela ne signifie pas que vous ne pouvez pas rendre votre code flexible. Voyons comment contourner ces limitations.
Méthode 1 : Fonctions variadiques (Variadic Functions) — « simple et efficace »
La méthode la plus simple consiste à utiliser les trois points ... pour passer un nombre variable d'arguments du même type.
package main
import "fmt"
// Sum accepte n'importe quel nombre d'entiersfunc Sum(nums ...int) int { total := 0 for _, n := range nums { total += n } return total}
func main() { fmt.Println(Sum(1, 2, 3)) // 6 fmt.Println(Sum(10, 20)) // 30 fmt.Println(Sum()) // 0 — fonctionne aussi}Avantages : simplicité, prise en charge native du langage.
Inconvénients : tous les arguments doivent être du même type. Impossible de dire « passe une chaîne, puis un entier optionnel ».
Les fonctions variadiques en Go sont parfaites pour les loggers, les additionneurs et toutes les opérations où le nombre de données est inconnu à l'avance.
Méthode 2 : Structure de configuration (Configuration Struct) — « quand il y a beaucoup de paramètres »
Si vous avez plus de 2-3 paramètres optionnels de types différents, utilisez une structure.
package main
import "fmt"
type EmailConfig struct { CC []string BCC []string Attachments []string IsHTML bool}
func SendEmail(to, subject, body string, cfg EmailConfig) { fmt.Printf("To: %s, Subject: %s", to, subject) if cfg.IsHTML { fmt.Println("Mode HTML activé") } if len(cfg.CC) > 0 { fmt.Printf("CC: %v", cfg.CC) }}
func main() { // Utilisation des valeurs par défaut (zero values) SendEmail("user@example.com", "Hello", "Body", EmailConfig{})
// Surcharge de certains champs cfg := EmailConfig{ CC: []string{"boss@example.com"}, IsHTML: true, } SendEmail("user@example.com", "Hello", "Body", cfg)}Remarque : les zero values en Go (chaîne vide, 0, nil pour les slices) deviennent les valeurs par défaut. C'est notre implémentation de paramètres optionnels en Go via les structures.
Avantages : lisible, typé, facile à étendre.
Inconvénients : il faut créer une structure à chaque fois, même si rien ne change.
Méthode 3 : Pattern Functional Options — « le standard en or de Go »
Ce pattern a été inventé par Dave Cheney, l'un des développeurs clés de Go. Il est utilisé dans des bibliothèques comme gRPC, AWS SDK, et la bibliothèque standard de Go elle-même (par exemple,
Blogs
Book Recommendations
Lire aussi
Fonctions Serverless en Rust sur AWS Lambda : techniques avancées
WebSocket sur Go : création d'applications en temps réel avec Golang
Programmation fonctionnelle en C++ : niveau avancé
Importation de paquets locaux en Go : guide pas à pas avec code
Débogage de code C++ : 8 techniques qui vous épargneront des nerfs