Las funciones y los métodos de Go pueden devolver varios valores:
func GetCard() (Card, error) { ... }
Todos los valores de retorno deben asignarse en orden y separarse con comas:
card, err := GetCard()
Cada posición en la asignación declara una variable.
En Go no se permite declarar una variable sin usarla.
Usa el identificador en blanco _ en lugar de un nombre de variable para omitir ese valor de retorno.
card, _ := GetCard() // error intentionally ignored
_, err := GetCard() // card ignored, only checking for error
error es una interfaz incorporada.
Un error nil significa que no ocurrió 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 su último valor.
Quien llama debe verificarlo antes de usar cualquier otro valor de retorno:
card, err := GetCard()
if err != nil {
// unsafe to use card here
return err
}
// safe to use card here
El patrón de asignación de dos valores también aparece fuera del manejo de error.
Las búsquedas en mapas, las aserciones de tipo y las recepciones de canales usan un segundo valor booleano, etiquetado como ok por convención, 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 de retorno también pueden recibir nombres en la firma de la función. Estas variables son accesibles dentro del cuerpo.
func divide(a, b int) (quotient, remainder int) {
quotient = a / b
remainder = a % b
return quotient, remainder
}
Los valores de retorno con nombre documentan el significado de cada posición de retorno. También se pueden usar con un retorno desnudo, uno 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 más largas, los retornos desnudos suelen perjudicar la legibilidad porque no queda claro qué se está devolviendo. Prefiere valores de retorno explícitos, a menos que la función sea lo bastante corta como para que la firma siempre esté a la vista.
Para aprender más, consulta Go by Example: Multiple Return Values, Effective Go: Multiple Returns o el Tour of Go.