En raison de la gestion des erreurs dans Go, je me retrouve souvent avec des fonctions à valeurs multiples. Jusqu'à présent, la façon dont j'ai géré cela a été très compliquée et je recherche les meilleures pratiques pour écrire un code plus propre.
Disons que j'ai la fonction suivante:
type Item struct {
Value int
Name string
}
func Get(value int) (Item, error) {
// some code
return item, nil
}
Comment puis-je attribuer une nouvelle variable à item.Value
élégamment. Avant d'introduire la gestion des erreurs, ma fonction vient de revenir item
et je pourrais simplement faire ceci:
val := Get(1).Value
Maintenant je fais ceci:
item, _ := Get(1)
val := item.Value
N'y a-t-il pas un moyen d'accéder directement à la première variable retournée?
go
error-handling
return-value
multiple-return-values
Spearfisher
la source
la source
item
sera typiquementnil
en cas d'erreur. Sans rechercher d'abord une erreur, votre code plantera dans ce cas.Réponses:
Dans le cas d'une fonction de retour à valeurs multiples, vous ne pouvez pas faire référence à des champs ou des méthodes d'une valeur spécifique du résultat lors de l'appel de la fonction.
Et si l'un d'entre eux est un
error
, il est là pour une raison (qui est la fonction peut échouer) et vous ne devriez pas le contourner car si vous le faites, votre code suivant pourrait également échouer lamentablement (par exemple, ce qui entraînerait une panique d'exécution).Cependant, il peut y avoir des situations où vous savez que le code n'échouera en aucun cas. Dans ces cas, vous pouvez fournir une fonction d' assistance (ou une méthode) qui supprimera le
error
(ou déclenchera une panique d'exécution s'il se produit toujours).Cela peut être le cas si vous fournissez les valeurs d'entrée pour une fonction à partir du code et que vous savez qu'elles fonctionnent.
Les packages
template
et sont d'excellents exemplesregexp
: si vous fournissez un modèle ou une expression rationnelle valide au moment de la compilation, vous pouvez être sûr qu'ils pourront toujours être analysés sans erreur lors de l'exécution. Pour cette raison, letemplate
package fournit laMust(t *Template, err error) *Template
fonction et leregexp
package fournit laMustCompile(str string) *Regexp
fonction: ils ne retournent paserror
s parce que leur utilisation prévue est celle où l'entrée est garantie d'être valide.Exemples:
Retour à votre cas
SI vous pouvez être certain que
Get()
cela ne produira paserror
pour certaines valeurs d'entrée, vous pouvez créer uneMust()
fonction d' assistance qui ne renverra pas leerror
mais soulèvera une panique d'exécution si elle se produit toujours:Mais vous ne devriez pas l'utiliser dans tous les cas, juste au moment où vous êtes sûr que cela réussit. Usage:
Alternative / Simplification
Vous pouvez même le simplifier davantage si vous intégrez l'
Get()
appel dans votre fonction d'assistance, appelons-leMustGet
:Usage:
Voir quelques questions intéressantes / liées:
comment analyser plusieurs retours dans golang
Retourne la carte comme 'ok' dans Golang sur les fonctions normales
la source
Non, mais c'est une bonne chose car vous devez toujours gérer vos erreurs.
Il existe des techniques que vous pouvez utiliser pour différer la gestion des erreurs, voir Les erreurs sont des valeurs de Rob Pike.
Dans cet exemple du billet de blog, il illustre comment vous pouvez créer un
errWriter
type qui diffère la gestion des erreurs jusqu'à ce que vous ayez fini d'appelerwrite
.la source
Oui il y a.
Surprenant, hein? Vous pouvez obtenir une valeur spécifique à partir d'un retour multiple en utilisant une
mute
fonction simple :https://play.golang.org/p/IwqmoKwVm-
Remarquez comment vous sélectionnez le numéro de valeur comme vous le feriez dans une tranche / un tableau, puis le type pour obtenir la valeur réelle.
Vous pouvez en savoir plus sur la science derrière cela dans cet article . Crédits à l'auteur.
la source
Non, vous ne pouvez pas accéder directement à la première valeur.
Je suppose qu'un hack pour cela serait de retourner un tableau de valeurs au lieu de "item" et "err", puis de le faire,
item, _ := Get(1)[0]
mais je ne le recommanderais pas.la source
Que diriez-vous de cette façon?
la source