Automatización de rutinas en Go: cómo escribir scripts que funcionan y no se rompen

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿Por qué Go es el lenguaje ideal para la automatización?

\n\n

¿Alguna vez has escrito un script en Python que funcionaba perfectamente en tu portátil, pero "fallaba" en el servidor por falta de la versión correcta del intérprete? ¿O tal vez tu script de Bash se convertía en un monstruo imposible de mantener cuando la lógica se volvía un poco más compleja que "copiar un archivo"?

\n\n

Si es así, deberías echarle un vistazo a Go. Este lenguaje fue creado en las entrañas de Google precisamente para resolver los problemas que enfrentan los ingenieros al escribir utilidades y servicios. Se compila en un solo binario (¡sin dependencias!), funciona a velocidad cósmica y tiene una sintaxis simple pero potente.

\n\n

En este artículo no te enseñaremos los fundamentos de la sintaxis. Iremos directo al grano: automatización de tareas en Go con ejemplos de código reales. Aprenderás a escribir tus primeros "scripts Go" que funcionarán de manera más confiable y rápida que sus equivalentes en Python. ¡Allá vamos!

\n\n

1. Trabajo con el sistema de archivos: limpiando logs como un profesional

\n\n

Una de las tareas más comunes para un administrador o desarrollador es la limpieza de logs antiguos. Escribamos una utilidad que elimine archivos de más de N días en un directorio dado. Este es un ejemplo clásico de automatización en Go.

\n\n
package main\n\nimport (\n    "fmt"\n    "os"\n    "path/filepath"\n    "time"\n)\n\nfunc main() {\n    // Ruta al directorio de logs\n    logDir := "/var/log/myapp"\n    // Eliminar archivos de más de 7 días\n    maxAge := 7 * 24 * time.Hour\n\n    err := filepath.Walk(logDir, func(path string, info os.FileInfo, err error) error {\n        if err != nil {\n            return err\n        }\n\n        // Omitir directorios\n        if info.IsDir() {\n            return nil\n        }\n\n        // Verificar la antigüedad del archivo\n        if time.Since(info.ModTime()) > maxAge {\n            fmt.Printf("Eliminando archivo antiguo: %s (edad: %v)\\n", path, time.Since(info.ModTime()))\n            err := os.Remove(path)\n            if err != nil {\n                fmt.Printf("Error al eliminar %s: %v\\n", path, err)\n            }\n        }\n        return nil\n    })\n\n    if err != nil {\n        fmt.Printf("Error al recorrer el directorio: %v\\n", err)\n    }\n}\n
\n\n

Este código es un excelente ejemplo de cómo automatizar tareas en Go sin bibliotecas adicionales. El paquete incorporado filepath recorre carpetas recursivamente, y os.Remove libera espacio. Al compilarlo una vez, obtienes un binario que se puede ejecutar con cron en cualquier servidor.

\n\n

2. Solicitudes HTTP y análisis de API

\n\n

Supongamos que necesitas monitorear el estado de varios microservicios o analizar datos de una API externa. Go con sus gorutinas maneja esto de manera brillante. Escribamos un script que verifique la disponibilidad de sitios web y envíe una notificación si algo falla. Este es otro poderoso ejemplo de automatización en Golang.

\n\n
package main\n\nimport (\n    "fmt"\n    "net/http"\n    "sync"\n    "time"\n)\n\nfunc checkURL(url string, wg *sync.WaitGroup) {\n    defer wg.Done()\n\n    client := http.Client{\n        Timeout: 5 * time.Second,\n    }\n\n    resp, err := client.Get(url)\n    if err != nil {\n        fmt.Printf("[FAIL] %s - %v\\n", url, err)\n        return\n    }\n    defer resp.Body.Close()\n\n    if resp.StatusCode != http.StatusOK {\n        fmt.Printf("[WARN] %s - estado: %d\\n", url, resp.StatusCode)\n    } else {\n        fmt.Printf("[OK]   %s - funcionando\\n", url)\n    }\n}\n\nfunc main() {\n    urls := []string{\n        "https://google.com",\n        "https://github.com",\n        "https://pythonlib.ru",\n        "https://non-existent-site.xyz",\n    }\n\n    var wg sync.WaitGroup\n\n    for _, url := range urls {\n        wg.Add(1)\n        go checkURL(url, &wg) // Ejecutar en una gorutina\n    }\n\n    wg.Wait() // Esperar a que todas las gorutinas terminen\n    fmt.Println("Verificación completada.")\n}\n
\n\n

Observa el uso de s

Blogs

Book Recommendations