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 exemples regexp
: 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, le template
package fournit la Must(t *Template, err error) *Template
fonction et le regexp
package fournit la MustCompile(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:
// "text" is a valid template, parsing it will not fail
var t = template.Must(template.New("name").Parse("text"))
// `^[a-z]+\[[0-9]+\]$` is a valid regexp, always compiles
var validID = regexp.MustCompile(`^[a-z]+\[[0-9]+\]$`)
Retour à votre cas
SI vous pouvez être certain que Get()
cela ne produira pas error
pour certaines valeurs d'entrée, vous pouvez créer une Must()
fonction d' assistance qui ne renverra pas le error
mais soulèvera une panique d'exécution si elle se produit toujours:
func Must(i Item, err error) Item {
if err != nil {
panic(err)
}
return i
}
Mais vous ne devriez pas l'utiliser dans tous les cas, juste au moment où vous êtes sûr que cela réussit. Usage:
val := Must(Get(1)).Value
Alternative / Simplification
Vous pouvez même le simplifier davantage si vous intégrez l' Get()
appel dans votre fonction d'assistance, appelons-le MustGet
:
func MustGet(value int) Item {
i, err := Get(value)
if err != nil {
panic(err)
}
return i
}
Usage:
val := MustGet(1).Value
Voir quelques questions intéressantes / liées:
comment analyser plusieurs retours dans golang
Retourne la carte comme 'ok' dans Golang sur les fonctions normales
item
sera typiquementnil
en cas d'erreur. Sans rechercher d'abord une erreur, votre code plantera dans ce cas.