10. Errores#

Si bien Go no implementa excepciones como una construcción propia del lenguaje, es posible hacer un control de errores por medio del módulo errors.

Por eso, en Go es común que los errores sean devueltos “normalmente” desde una función y quien invocó dicha función es responsable de manejar un posible error.

10.1. Crear errores simples#

package main

import (
    "errors"
    "fmt"
)

func test(input int) error {
    if input < 0 {
        // Creamos un error con un mensaje estático
        return errors.New("input must be greater or equal to zero")
    }
    return nil
}

func main() {
    err := test(-1)
    if err != nil {
        fmt.Print(err)
    }
}

10.2. Crear errores con formateo dinámico#

Además, Go incluye en el paquete fmt la función fmt.Errorf, que permite crear errores con mensajes formateados, similar a fmt.Sprintf. Esto es muy útil para agregar información dinámica al mensaje de error.

package main

import "fmt"

func test(input int) error {
    if input < 0 {
        // Se agrega información dinámica al mensaje
        return fmt.Errorf("input must be greater or equal to zero, instead it was: %d", input)
    }
    return nil
}

func main() {
    err := test(-1)
    if err != nil {
        fmt.Print(err)
    }
}

En este ejemplo, la función retorna un error más informativo que incluye el valor de entrada que causó el problema. Este tipo de mensajes con contexto son de gran ayuda para depuración y logging.


En los dos ejemplos anteriores, podemos observar la forma típica en la que se maneja un error en Go. Van a encontrar if err != nil en multiples lugares de un programa de Go.

Go tiene una forma de “lanzar” errores por medio de la función panic, pero esta debería ser reservada para casos muy extremos, ya que no es posible recuperar el programa luego de esa invocación.