Go peut-il avoir des paramètres facultatifs? Ou puis-je simplement définir deux fonctions avec le même nom et un nombre d'arguments différent?
go
overloading
devyn
la source
la source
Réponses:
Go n'a pas de paramètres facultatifs et ne prend pas en charge la surcharge de méthode :
la source
make
un cas particulier? Ou n'est-il même pas vraiment implémenté en fonction…make
est une construction de langage et les règles mentionnées ci-dessus ne s'appliquent pas. Voir cette question connexe .range
est le même cas quemake
, en ce sensUne bonne façon de réaliser quelque chose comme des paramètres facultatifs est d'utiliser des arguments variadiques. La fonction reçoit en fait une tranche du type que vous spécifiez.
la source
params
est une tranche d'intsVous pouvez utiliser une structure qui inclut les paramètres:
la source
Pour un nombre arbitraire et potentiellement important de paramètres facultatifs, un idiome agréable consiste à utiliser les options fonctionnelles .
Pour votre type
Foobar
, écrivez d'abord un seul constructeur:où chaque option est une fonction qui mute le Foobar. Ensuite, fournissez des moyens pratiques à votre utilisateur d'utiliser ou de créer des options standard, par exemple:
Terrain de jeux
Par souci de concision, vous pouvez donner un nom au type des options ( Playground ):
Si vous avez besoin de paramètres obligatoires, ajoutez-les comme premiers arguments du constructeur avant le variadic
options
.Les principaux avantages de l' idiome des options fonctionnelles sont les suivants:
Cette technique a été inventée par Rob Pike et également démontrée par Dave Cheney .
la source
func()
s si besoin est, que de plier mon cerveau autour de cette approche. Chaque fois que je dois utiliser cette approche, comme avec la bibliothèque Echo, je trouve mon cerveau pris dans le trou du lapin des abstractions. #fwiwNi les paramètres facultatifs ni la surcharge de fonctions ne sont pris en charge dans Go. Go prend en charge un nombre variable de paramètres: Passer des arguments à ... paramètres
la source
Non - non plus. Selon les documents des programmeurs Go for C ++ ,
Je ne trouve pas de déclaration aussi claire que les paramètres facultatifs ne sont pas pris en charge, mais ils ne sont pas non plus pris en charge.
la source
Vous pouvez l'encapsuler assez bien dans une fonction similaire à celle ci-dessous.
Dans cet exemple, l'invite par défaut a deux points et un espace devant elle. . .
. . . cependant, vous pouvez remplacer cela en fournissant un paramètre à la fonction d'invite.
Cela se traduira par une invite comme ci-dessous.
la source
J'ai fini par utiliser une combinaison d'une structure de paramètres et d'arguments variadiques. De cette façon, je n'ai pas eu à changer l'interface existante qui était consommée par plusieurs services et mon service a pu passer des paramètres supplémentaires selon les besoins. Exemple de code dans la cour de récréation de Golang: https://play.golang.org/p/G668FA97Nu
la source
Le langage Go ne prend pas en charge la surcharge de méthode, mais vous pouvez utiliser des arguments variadiques tout comme les paramètres facultatifs, vous pouvez également utiliser l'interface {} comme paramètre, mais ce n'est pas un bon choix.
la source
Je suis un peu en retard, mais si vous aimez une interface fluide, vous pouvez concevoir vos setters pour des appels en chaîne comme celui-ci:
Et puis appelez-le comme ceci:
Ceci est similaire à l' idiome des options fonctionnelles présenté sur la réponse @Ripounet et bénéficie des mêmes avantages mais présente certains inconvénients:
err
variable et à la mettre à zéro.Il y a cependant un petit avantage possible, ce type d'appels de fonction devrait être plus facile pour le compilateur à s'aligner mais je ne suis vraiment pas un spécialiste.
la source
Vous pouvez passer des paramètres nommés arbitraires avec une carte.
la source
Une autre possibilité serait d'utiliser une structure qui avec un champ pour indiquer si elle est valide. Les types nuls de sql tels que NullString sont pratiques. C'est bien de ne pas avoir à définir votre propre type, mais si vous avez besoin d'un type de données personnalisé, vous pouvez toujours suivre le même modèle. Je pense que l'option-ness est claire à partir de la définition de la fonction et il y a un minimum de code ou d'effort supplémentaire.
Par exemple:
la source