Le concept de fonctions variadiques dans Go permet aux fonctions d'accepter un nombre variable d'arguments. Cependant, lors de la transmission de ces arguments à d'autres fonctions, il est crucial de gérer correctement l'expansion des paramètres.
Problème :
Considérez la fonction Die suivante, qui sert de wrapper autour de fmt.Fprintf :
func Die(format string, args ...interface{}) { str := fmt.Sprintf(format, args) fmt.Fprintf(os.Stderr, "%v\n", str) os.Exit(1) }
Lors de l'appel de Die("foo"), la sortie affiche de manière inattendue "foo%!(EXTRA []interface {}=[])" au lieu de simplement "foo".
Explication :
Les fonctions variadiques traitent leurs arguments comme une tranche d'un type particulier. Dans la fonction Die, args est une tranche de type []interface{}. Lorsqu'il est transmis à fmt.Sprintf, il est traité comme un argument unique de type []interface{}, sans développer les valeurs individuelles.
Solution :
Pour transmettre arguments individuels correctement, utilisez la syntaxe ... :
str := fmt.Sprintf(format, args...)
Cela développe la tranche d'arguments et transmet chaque valeur en tant qu'argument distinct.
Informations supplémentaires :
La spécification Go clarifie davantage ce comportement :
"Le type d'un argument de fonction variadique est une tranche du type des arguments individuels. L'appel d'une fonction variadique fournit une conversion implicite à partir d'un ensemble de a fourni des valeurs au type de tranche."
En comprenant ce concept, vous pouvez transmettre correctement des arguments variadiques à d'autres fonctions et éviter une sortie inattendue.
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!