¿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\nSi 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\nEn 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\n1. Trabajo con el sistema de archivos: limpiando logs como un profesional
\n\nUna 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\npackage 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\nEste 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.
2. Solicitudes HTTP y análisis de API
\n\nSupongamos 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\npackage 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\nObserva el uso de s