W przypadku funkcji zwracającej wielowartościowe wywołanie funkcji nie może odwoływać się do pól lub metod o określonej wartości wyniku.
A jeśli jeden z nich jest to error
, że to nie dla rozumu (który jest funkcja może nie) i należy nie obwodnica, bo jeśli nie, twój kolejny kod może również nie zdało egzaminu (np powodując wykonawczego paniki).
Jednak mogą wystąpić sytuacje, w których wiesz, że kod nie zawiedzie w żadnych okolicznościach. W takich przypadkach można zapewnić funkcję (lub metodę) pomocniczą, która odrzuci error
(lub podniesie panikę w czasie wykonywania, jeśli nadal występuje).
Może się tak zdarzyć, jeśli podasz wartości wejściowe funkcji z kodu i wiesz, że działają.
Świetnymi przykładami tego są pakiety template
i regexp
: jeśli podasz prawidłowy szablon lub wyrażenie regularne w czasie kompilacji, możesz być pewien, że zawsze można je przeanalizować bez błędów w czasie wykonywania. Z tego powodu template
pakiet zapewnia Must(t *Template, err error) *Template
funkcję, a regexp
pakiet zapewnia MustCompile(str string) *Regexp
funkcję: nie zwracająerror
s, ponieważ ich zamierzone użycie jest tam, gdzie dane wejściowe są gwarantowane.
Przykłady:
// "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]+\]$`)
Wracając do twojej sprawy
JEŚLI możesz być pewien, Get()
że nie wygeneruje error
pewnych wartości wejściowych, możesz utworzyć funkcję pomocniczą, Must()
która nie zwróci, error
ale wywoła panikę w czasie wykonywania, jeśli nadal występuje:
func Must(i Item, err error) Item {
if err != nil {
panic(err)
}
return i
}
Ale nie powinieneś tego używać we wszystkich przypadkach, tylko wtedy, gdy masz pewność, że się powiedzie. Stosowanie:
val := Must(Get(1)).Value
Alternatywa / uproszczenie
Możesz nawet jeszcze bardziej to uprościć, jeśli włączysz Get()
wywołanie do funkcji pomocniczej, nazwijmy to MustGet
:
func MustGet(value int) Item {
i, err := Get(value)
if err != nil {
panic(err)
}
return i
}
Stosowanie:
val := MustGet(1).Value
Zobacz kilka interesujących / powiązanych pytań:
jak analizować wielokrotne zwroty w golang
Zwróć mapę jak „ok” w Golang na normalnych funkcjach
item
zwyklenil
w przypadku błędu. Bez uprzedniego sprawdzenia, czy nie wystąpił błąd, w takim przypadku kod ulegnie awarii.