Comment retourner un int ou nul dans golang?
Je suis un développeur java et j'apprends Aller.
Je suis en train d'écrire un simple " pop " de l'opération pour une pile LIFO. La question est de savoir avec la valeur de retour quand il n'y a pas de valeurs dans la pile. En java, je suis en mesure de retourner un wrapper(Entier) dans le cas positif et null si il n'y a pas de valeurs. Il est naturel de mon point de vue.
Comment puis-je faire quelque chose de similaire en Aller? Existe-il des struct des wrappers pour les primitives? Dois-je retourner deux valeurs(la deuxième indique le code d'erreur)? Ou dois-je lancer une exception?
Voici à quoi il ressemble pour l'instant:
func (s *stack) Pop() (int, bool) {
if s.size == 0 {
return 0, true
}
s.size--
val := s.stack[s.size]
return val, false
}
Est-il bon style?
- Vous pouviez retourner un
*int
. Vous ne savez pas si c'est agréable, bien que. - Veuillez noter que la langue est appelée "Go". Deux lettres, la première capitalisées". golang" est une partie du nom de domaine et un mot-clé spécial compris par un moteur de recherche populaire détenue par une société où le développement de Go à l'origine.
- Un autre point est que Go ne fait pas exception (heureusement). Il a
panic()
etrecover()
mais ils sont pas exceptions; traiter les erreurs comme des valeurs, et envisagez de traiter judicieusement 😉
Vous devez vous connecter pour publier un commentaire.
Depuis un nombre ne peut pas être
nil
, vous ne pouvez pas retournernil
pour entier, sauf si vous définissez la valeur de retour comme un pointeur. Le idiomatiques de la solution dans le jeu de Go est de définir votre méthode de retourner plusieurs valeurs, par exempleAlors quelque part, vous pouvez appeler
Pop
commePrendre un coup d'oeil à virgule, ok idiome.
return 0, false
et le second retour doit êtrereturn val, true
.Il n'y a pas
try/catch
constructions en Aller, de sorte que vous ne pouvez pas compter sur cela.Aller a lieu une fonctionnalité intéressante, permettant à de multiples valeurs de retour. Et leur erreur de manipulation est construit sur ce.
Donc la manière canonique pour faire face à la possibilité d'une exception est à retourner à la fois une valeur et une erreur. Après l'opération, l'erreur est cochée, et que des mesures, en ignorant la valeur. Dans votre cas, vous pouvez conserver la valeur d'une
int
, et d'utiliser une valeur par défaut de0
dans le cas d'une erreur. Depuis les clients, elle l'espère, d'ignorer la valeur de ce cas et de faire quelque chose au sujet de l'erreur.0
, vous savez que c'est une bonne valeur. Le test doit simplement êtreif resp1 != nil { // exception handling }
. Vous ne regardez pas àresp0
, jusqu'à ce que vous savezresp1 == nil
et aucune erreur n'est survenue. Vous pouvez donc faire confianceresp0
à une valeur valide à partir de la pile. Aller est dogmatique de cette façon. Vous ne devriez pas ignorer l'erreur, et vous devriez vous en occuper dès que vous le pouvez, plutôt que dans unecatch
fermer quelque part plus tard.