Maîtriser les fonctions variadiques en Go With
En Go, les fonctions variadiques sont souvent introduites à l’aide de fmt. Imprimer() ou somme() Exemples. Mais dans Projets du monde réel, l’une des utilisations les plus puissantes des fonctions variadiques est la Modèle d’options fonctionnelles — en utilisant Avec() Assistants de style pour la création d’objets.
Ce modèle fait que vos constructeurs :
- Plus lisible
- Plus facile à étendre
- Plus sûr grâce à la validation intégrée
Qu’est-ce qu’une fonction variadique en Go ?
Une fonction variadique est une fonction qui accepte un nombre variable d’arguments. Vous le définissez à l’aide d’un points de suspension (...) avant le type du dernier paramètre.
func sum(numbers ...int) int {
total := 0
for _, num := range numbers {
total += num
}
return total
}
fmt.Println(sum(1, 2, 3)) // 6
fmt.Println(sum(1,2)) // 3
Dans ce cas, numbers est une tranche ([]Int), ce qui permet une certaine flexibilité dans le nombre d’arguments que vous transmettez.
Utilisation réelle : options fonctionnelles avec()
Dans le monde réel, les projets Go restent rarement petits. Au fil du temps, les constructeurs ont tendance à gonfler avec des paramètres - peut-être que cela a commencé comme un petit outil pour appeler une API.
Au début, la création de votre client HTTP était simple :
NewClient("https://api.example.com")
Mais à mesure que les exigences s’accumulent, votre constructeur commence à gonfler:
- Vous avez besoin d’un URL de base.
- Vous ajoutez un Timeout.
- Vous passez un Jeton d’API pour l’authentification.
- Vous vous lancez Nombre de nouvelles tentatives pour la fiabilité.
- Peut-être un transport HTTP personnalisé pour la prise en charge du proxy.
Maintenant, votre appel autrefois propre ressemble à ceci :
NewClient("https://api.example.com", 5*time.Second, "Bearer token", nil, true, 3)
Au premier coup d’œil... Que signifient ces paramètres ?
- Est-ce que nil pour les en-têtes ou un transport personnalisé ?
- Est-ce que true permet les nouvelles tentatives ou le débogage ?
- Que se passe-t-il si vous ajoutez un paramètre supplémentaire au milieu ?
C’est comme essayer de assembler des meubles IKEA sans la feuille d’instructions — les pièces sont toutes là, mais vous feuilletez constamment le manuel pour vous rappeler où chacun va.
Solution
Maintenant, imaginez Refactorisation ceci en utilisant le Avec() modèle d’options fonctionnelles. La configuration de votre client est soudaine se lit comme une phrase:
Recommandé par LinkedIn
client := NewClient(
WithBaseURL("https://api.example.com"),
WithTimeout(5*time.Second),
WithHeader("Authorization", "Bearer token"),
)
Plus besoin de deviner :
- Auto-documentation — Chaque option vous dit exactement ce qu’elle fait.
- Indépendant de l’ordre — Mélangez et assortissez sans rien casser.
- À l’épreuve du temps — Ajouter un nouveau WithRetries(3) sans toucher au code existant.
Il ne s’agit pas seulement d’un code plus propre, il s’agit Un code qui ressemble à une conversation, où vous pouvez lire la configuration et comprendre instantanément l’intention sans rechercher la signature de fonction.
🔗 Vous voulez voir un exemple fonctionnel complet ?
Avantages et limites de la fonction variadique
Avantages
- Constructeurs plus propres et plus lisibles
- Prend en charge les arguments optionnels sans fonctions multiples
- Facile à étendre sans interrompre les appels existants
- Permet la validation par option
Contre
- Légère surcharge due à l’allocation de tranches supplémentaires
- Peut être mal utilisé si trop d’options sont ajoutées sans structure
Bonnes pratiques
- Conservez le paramètre variadique au niveau fin du constructeur.
- Préparez chacun avec() Autonome et validé.
- Évitez de vider toute la logique dans Nouveau... — laissez chaque option gérer son propre champ.
- Document disponible avec() des options clairement pour les autres développeurs.
Conclusion
Les fonctions variadiques en Go sont bien plus qu’un tour de passe-passe pour débutants. Lorsqu’il est associé au Avec() options fonctionnelles, ils deviennent un Outil de conception puissant pour créer des API Go maintenables, évolutives et propres.
🔗 Vous voulez voir un exemple fonctionnel complet ? J’ai créé un Référentiel GitHub Démontrant:
- Client HTTP avec nouvelles tentatives
- Gestion des certificats TLS
- Requêtes GET & POST avec en-têtes personnalisés
💬 Avez-vous utilisé Avec() dans vos projets Go ? Partagez votre expérience dans les commentaires !