Las funciones y los métodos de Go pueden devolver varios valores:
func GetCard() (Card, error) { ... }
Cada valor devuelto debe asignarse en orden y separarse con comas:
card, err := GetCard()
Cada posición de la asignación declara una variable.
En Go no está permitido declarar una variable y no usarla.
Usa el identificador en blanco _ en lugar de un nombre de variable para omitir ese valor devuelto.
card, _ := GetCard() // error intentionally ignored
_, err := GetCard() // card ignored, only checking for error
error es una interfaz integrada.
Un error con valor nil significa que no se produjo ningún error; cualquier valor distinto de nil significa que algo salió mal.
Por convención, las funciones que pueden fallar deben devolver un error como último valor.
Quien llama a la función debe comprobarlo antes de usar cualquier otro valor devuelto:
card, err := GetCard()
if err != nil {
// unsafe to use card here
return err
}
// safe to use card here
El patrón de asignación con dos valores también aparece fuera de la gestión de error.
Las consultas en mapas, las aserciones de tipo y las recepciones de canales usan un segundo valor booleano, al que por convención se etiqueta como ok, para indicar éxito o la presencia de datos:
m := map[string]int{"a": 1}
v, ok := m["a"] // ok is true
v, ok = m["z"] // ok is false
var i interface{} = "hello"
v, ok := i.(string) // ok is true
v, ok = i.(int) // ok is false
v, ok := <-ch // ok is false if ch is closed and empty
Los valores devueltos también pueden recibir nombres en la firma de la función. Esas variables son entonces accesibles dentro del cuerpo.
func divide(a, b int) (quotient, remainder int) {
quotient = a / b
remainder = a % b
return quotient, remainder
}
Los valores devueltos con nombre documentan el significado de cada posición de retorno. También pueden usarse con un retorno desnudo, escrito sin valores. Los retornos desnudos devuelven implícitamente los valores actuales de las variables con nombre:
func split(sum int) (x, y int) {
x = sum * 4 / 9
y = sum - x
return
}
En funciones largas, los retornos desnudos suelen perjudicar la legibilidad, porque no queda claro qué se está devolviendo. Prefiere los valores devueltos explícitos, salvo que la función sea lo bastante corta como para que la firma esté siempre a la vista.
Para saber más, consulta Go by Example: Multiple Return Values, Effective Go: Multiple Returns o el Tour of Go.