Puis-je écrire une simple instruction if-else avec une affectation de variable dans go (golang) comme je le ferais en php? Par exemple:
$var = ( $a > $b )? $a: $b;
Actuellement, je dois utiliser ce qui suit:
var c int
if a > b {
c = a
} else {
c = b
}
Désolé, je ne me souviens pas du nom si cette instruction de contrôle et je n'ai pas pu trouver les informations sur le site ou via la recherche Google. : /
Réponses:
Comme les commentaires l'ont mentionné, Go ne prend pas en charge les doublures ternaires. La forme la plus courte à laquelle je puisse penser est la suivante:
Mais s'il vous plaît ne faites pas cela, cela n'en vaut pas la peine et ne fera que dérouter les personnes qui liront votre code.
la source
J'utilise souvent ce qui suit:
fondamentalement la même chose que @ Not_a_Golfer mais en utilisant l' inférence de type .
la source
listeningPath := "production.some.com"; if DEBUG { listeningPath := "development.some.com" }
même vitesse que le ternaire pour la production, et à mon avis assez bonne lisibilité.Comme les autres l'ont mentionné,
Go
ne prend pas en charge les monoplaces ternaires. Cependant, j'ai écrit une fonction utilitaire qui pourrait vous aider à réaliser ce que vous voulez.Voici quelques cas de test pour montrer comment vous pouvez l'utiliser
Pour le plaisir, j'ai écrit des fonctions utilitaires plus utiles telles que:
Si vous souhaitez utiliser l'un de ceux-ci, vous pouvez les trouver ici https://github.com/shomali11/util
la source
Merci d'avoir indiqué la bonne réponse.
Je viens de consulter la FAQ de Golang (duh) et il est clairement indiqué que ce n'est pas disponible dans la langue:
informations supplémentaires trouvées qui pourraient être intéressantes sur le sujet:
la source
var c int; if a > b { c = a } else { c = b }
:? Mais je suggérerais de le garder en 5 lignes pour former un bloc lumineux pour la récréation du lecteur;)Une façon possible de le faire en une seule ligne en utilisant une carte, simple je vérifie si
a > b
si elle esttrue
j'assignec
àa
autreb
Cependant, cela semble incroyable, mais dans certains cas, ce n'est peut-être PAS la solution parfaite en raison de l'ordre d'évaluation. Par exemple, si je vérifie si un objet n'en
nil
obtient pas une propriété, regardez l'extrait de code suivant qui le ferapanic
en cas demyObj equals nil
Parce que la carte sera créée et construite avant d'évaluer la condition, dans ce cas,
myObj = nil
cela paniquera simplement.Sans oublier de mentionner que vous pouvez toujours faire les conditions en une seule ligne simple, vérifiez les points suivants:
la source
Utiliser la fonction lambda au lieu de l'opérateur ternaire
Exemple 1
pour donner le max int
Exemple 2
Supposons que vous ayez cette
must(err error)
fonction pour gérer les erreurs et que vous souhaitiez l'utiliser lorsqu'une condition n'est pas remplie. (profitez-en sur https://play.golang.com/p/COXyo0qIslP )la source
Parfois, j'essaie d'utiliser la fonction anonyme pour que la définition et l'attribution se produisent sur la même ligne. comme ci-dessous:
https://play.golang.org/p/rMjqytMYeQ0
la source
Une construction très similaire est disponible dans la langue
*
c'est à dire
la source
Vous pouvez utiliser une fermeture pour cela:
Le seul reproche que j'ai avec la syntaxe de fermeture dans Go est qu'il n'y a pas d'alias pour la fonction de retour zéro paramètre zéro par défaut, alors ce serait beaucoup plus agréable (pensez à la façon dont vous déclarez les littéraux de carte, de tableau et de tranche avec juste un nom de type).
Ou même la version plus courte, comme un commentateur vient de le suggérer:
Vous auriez toujours besoin d'utiliser une fermeture si vous deviez donner des paramètres aux fonctions. Cela pourrait être évité dans le cas du passage de méthodes plutôt que de simples fonctions, je pense, où les paramètres sont la structure associée aux méthodes.
la source
doif(condition, dothis, dothat)