Debido al manejo de errores en Go, a menudo termino con funciones de valores múltiples. Hasta ahora, la forma en que lo he manejado ha sido muy complicada y estoy buscando las mejores prácticas para escribir código más limpio.
Digamos que tengo la siguiente función:
type Item struct {
Value int
Name string
}
func Get(value int) (Item, error) {
// some code
return item, nil
}
¿Cómo puedo asignar una nueva variable a item.Value
elegantemente? Antes de introducir el manejo de errores, mi función acaba de regresar item
y simplemente podría hacer esto:
val := Get(1).Value
Ahora hago esto:
item, _ := Get(1)
val := item.Value
¿No hay alguna forma de acceder directamente a la primera variable devuelta?
go
error-handling
return-value
multiple-return-values
Pescador submarino
fuente
fuente
item
normalmente seránil
en caso de error. Sin comprobar primero si hay un error, su código fallará en ese caso.Respuestas:
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
yregexp
: 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, eltemplate
paquete proporciona laMust(t *Template, err error) *Template
función y elregexp
paquete proporciona laMustCompile(str string) *Regexp
función: no regresanerror
s porque su uso previsto es donde se garantiza que la entrada es válida.Ejemplos:
De vuelta a tu caso
SI puede estar seguro de
Get()
que no produciráerror
para ciertos valores de entrada, puede crear unaMust()
función auxiliar que no devolverá el,error
pero generará un pánico en tiempo de ejecución si aún ocurre:Pero no debe usar esto en todos los casos, solo cuando esté seguro de que tiene éxito. Uso:
Alternativa / simplificación
Incluso puede simplificarlo aún más si incorpora la
Get()
llamada en su función auxiliar, llamémoslaMustGet
:Uso:
Vea algunas preguntas interesantes / relacionadas:
cómo analizar múltiples devoluciones en golang
Devuelve el mapa como 'ok' en Golang en funciones normales
fuente
No, pero eso es bueno, ya que siempre debes manejar tus errores.
Existen técnicas que puede emplear para diferir el manejo de errores, consulte Los errores son valores de Rob Pike.
En este ejemplo de la publicación del blog, ilustra cómo puede crear un
errWriter
tipo que difiera el manejo de errores hasta que haya terminado de llamarwrite
.fuente
Sí hay.
Sorprendente, ¿eh? Puede obtener un valor específico de una devolución múltiple usando una
mute
función simple :https://play.golang.org/p/IwqmoKwVm-
Observe cómo selecciona el número de valor tal como lo haría de un segmento / matriz y luego el tipo para obtener el valor real.
Puede leer más sobre la ciencia detrás de eso en este artículo . Créditos al autor.
fuente
No, no puede acceder directamente al primer valor.
Supongo que un truco para esto sería devolver una matriz de valores en lugar de "elemento" y "err", y luego simplemente hacerlo,
item, _ := Get(1)[0]
pero no lo recomendaría.fuente
¿Qué tal de esta manera?
fuente