In caso di una funzione di ritorno multivalore non è possibile fare riferimento a campi o metodi di un valore specifico del risultato quando si chiama la funzione.
E se uno di loro è una error
, è lì per un motivo (che è la funzione potrebbe fallire) e si dovrebbe non bypass, perché se lo fai, il tuo codice successivo potrebbe anche fallire miseramente (ad esempio, con conseguente tempo di esecuzione di panico).
Tuttavia, potrebbero esserci situazioni in cui sai che il codice non fallirà in nessuna circostanza. In questi casi è possibile fornire una funzione (o metodo) di supporto che scarterà il error
(o solleverà un panico di runtime se si verifica ancora).
Questo può essere il caso se fornisci i valori di input per una funzione dal codice e sai che funzionano.
Grandi esempi di questo sono i pacchetti template
e regexp
: se fornisci un modello valido o una regexp in fase di compilazione, puoi essere certo che possono sempre essere analizzati senza errori in fase di esecuzione. Per questo motivo il template
pacchetto fornisce la Must(t *Template, err error) *Template
funzione e il regexp
pacchetto fornisce la MustCompile(str string) *Regexp
funzione: non restituisconoerror
s perché il loro uso previsto è dove l'input è garantito per essere valido.
Esempi:
// "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]+\]$`)
Torniamo al tuo caso
Se puoi essere certo Get()
che non produrrà error
per determinati valori di input, puoi creare una Must()
funzione di supporto che non restituirebbe il error
ma solleverà un panico di runtime se si verifica ancora:
func Must(i Item, err error) Item {
if err != nil {
panic(err)
}
return i
}
Ma non dovresti usarlo in tutti i casi, solo quando sei sicuro che abbia successo. Uso:
val := Must(Get(1)).Value
Alternativa / Semplificazione
Puoi anche semplificarlo ulteriormente se incorpori la Get()
chiamata nella tua funzione di supporto, chiamiamola MustGet
:
func MustGet(value int) Item {
i, err := Get(value)
if err != nil {
panic(err)
}
return i
}
Uso:
val := MustGet(1).Value
Vedi alcune domande interessanti / correlate:
come analizzare più ritorni in golang
Restituisci mappa come "ok" in Golang sulle funzioni normali
item
sarà tipicamentenil
in caso di errore. Senza prima verificare la presenza di un errore, il codice andrà in crash in quel caso.