Tracks
/
Go
Go
/
Temario
/
Múltiples valores devueltos
Mú

Múltiples valores devueltos en Go

{one: "1 ejercicio", many: "%{count} ejercicios", other: "%{count} ejercicios"}

Acerca de Múltiples valores devueltos

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()

El identificador en blanco

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

Gestión de errores

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

La expresión coma-ok

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

Valores devueltos con nombre

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.

Editar en GitHub El enlace se abre en una nueva ventana o pestaña