Errores en funciones

¿Cómo escribir funciones que retornen errores en Go?

Go no soporta excepciones, por lo que las funciones retornan errores cuando sucede algo inesperado. Por convención, los errores siempre se envían como el último valor de la lista de valores retornados por una función.

Supongamos que deseamos habilitar un filtro para vender cervezas. Se puede vender cualquier cantidad, pero solo a personas que tengan 18 años o mas.

Creamos nuestra función.

func venderCerveza(edad int, cantidad int) (int, error) {
    if edad < 18 {
        err := fmt.Errorf("No se puede vender cerveza a menores")
        return 0, err
    }
    return cantidad, nil
}

La función venderCerveza recibe dos parámetros, la edad de quien intenta comprar la cerveza, y la cantidad de cervezas que se le venden. Retorna 2 posibles valores, la cantidad de cervezas vendidas y un posible error.

venderCerveza(edad int, cantidad int) (int, error)

Comprobamos si la edad es menor a 18 años.

edad < 18

Si es así generamos no venderemos ninguna cerveza y retornaremos un error (ese también es el orden de los valores retornados).

err := fmt.Errorf("No se puede vender cerveza a menores")
return 0, err

Si por el contrario el usuario no es menor de 18 años, la cantidad de cervezas vendidas es el numero solicitado y el error es nil.

return cantidad, nil

Para poder utilizar esta función necesitamos 2 variables, la cantidad a solicitar y un posible contenedor de errores.

var cantidad int
var err error

Primero verificamos si una persona de 15 años puede comprar 6 cervezas.

cantidad, err = venderCerveza(15, 6)
if err != nil {
    fmt.Println(err)
} else {
    fmt.Println("Se vendieron", cantidad, "cervezas")
}

El resultado sera no satisfactorio, ya que los menores no son autorizados para comprar.

No se puede vender cerveza a menores

Después verificamos una persona de 21 años puede comprar 24 cervezas.

cantidad, err = venderCerveza(21, 24)
if err != nil {
    fmt.Println(err)
} else {
    fmt.Println("Se vendieron", cantidad, "cervezas")
}

El resultado sera satisfactorio, ya que una persona de 21 años es mayor de edad.

Se vendieron 24 cervezas