En el caso de una función de retorno de varios valores, no puede hacer referencia a campos o métodos de un valor específico del resultado al llamar a la función.
Y si uno de ellos es una error
, que está ahí por un motivo (que es la función puede fallar) y se debe no by-pass, porque si lo hace, su código subsiguiente podría también fracasar miserablemente (por ejemplo, lo que resulta en tiempo de ejecución de pánico).
Sin embargo, puede haber situaciones en las que sepa que el código no fallará en ninguna circunstancia. En estos casos, puede proporcionar una función auxiliar (o método) que descartará el error
(o generará un pánico en tiempo de ejecución si aún ocurre).
Este puede ser el caso si proporciona los valores de entrada para una función desde el código y sabe que funcionan.
Grandes ejemplos de esto son los paquetes template
y regexp
: si proporciona una plantilla válida o regexp en tiempo de compilación, puede estar seguro de que siempre se pueden analizar sin errores en tiempo de ejecución. Por esta razón, el template
paquete proporciona la Must(t *Template, err error) *Template
función y el regexp
paquete proporciona la MustCompile(str string) *Regexp
función: no regresanerror
s porque su uso previsto es donde se garantiza que la entrada es válida.
Ejemplos:
// "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]+\]$`)
De vuelta a tu caso
SI puede estar seguro de Get()
que no producirá error
para ciertos valores de entrada, puede crear una Must()
función auxiliar que no devolverá el, error
pero generará un pánico en tiempo de ejecución si aún ocurre:
func Must(i Item, err error) Item {
if err != nil {
panic(err)
}
return i
}
Pero no debe usar esto en todos los casos, solo cuando esté seguro de que tiene éxito. Uso:
val := Must(Get(1)).Value
Alternativa / simplificación
Incluso puede simplificarlo aún más si incorpora la Get()
llamada en su función auxiliar, llamémosla MustGet
:
func MustGet(value int) Item {
i, err := Get(value)
if err != nil {
panic(err)
}
return i
}
Uso:
val := MustGet(1).Value
Vea algunas preguntas interesantes / relacionadas:
cómo analizar múltiples devoluciones en golang
Devuelve el mapa como 'ok' en Golang en funciones normales
item
normalmente seránil
en caso de error. Sin comprobar primero si hay un error, su código fallará en ese caso.