Pourquoi Go est-il le langage idéal pour l'automatisation ?
\n\nAvez-vous déjà écrit un script en Python qui fonctionnait parfaitement sur votre ordinateur portable, mais qui « plantait » sur le serveur à cause de l'absence de la bonne version de l'interpréteur ? Ou peut-être que votre script Bash se transformait en un monstre ingérable lorsque la logique devenait un peu plus complexe que « copier un fichier » ?
\n\nSi c'est le cas, vous devriez jeter un œil à Go. Ce langage a été créé dans les entrailles de Google précisément pour résoudre les problèmes rencontrés par les ingénieurs lors de l'écriture d'utilitaires et de services. Il se compile en un seul binaire (aucune dépendance !), fonctionne à une vitesse cosmique et possède une syntaxe simple mais puissante.
\n\nDans cet article, nous n'allons pas vous apprendre les bases de la syntaxe. Nous allons directement passer aux choses sérieuses : l'automatisation des tâches en Go avec des exemples de code réels. Vous apprendrez à écrire vos premiers « scripts Go » qui fonctionneront de manière plus fiable et plus rapide que leurs équivalents Python. C'est parti !
\n\n1. Gestion du système de fichiers : nettoyons les logs comme un pro
\n\nL'une des tâches les plus courantes pour un administrateur ou un développeur est le nettoyage des anciens logs. Écrivons un utilitaire qui supprime les fichiers de plus de N jours dans un répertoire donné. C'est un exemple classique d'automatisation en Go.
\n\npackage main\n\nimport (\n "fmt"\n "os"\n "path/filepath"\n "time"\n)\n\nfunc main() {\n // Chemin vers le répertoire des logs\n logDir := "/var/log/myapp"\n // Supprimer les fichiers de plus de 7 jours\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 // Ignorer les répertoires\n if info.IsDir() {\n return nil\n }\n\n // Vérifier l'âge du fichier\n if time.Since(info.ModTime()) > maxAge {\n fmt.Printf("Suppression du fichier ancien : %s (âge : %v)\\n", path, time.Since(info.ModTime()))\n err := os.Remove(path)\n if err != nil {\n fmt.Printf("Erreur lors de la suppression de %s : %v\\n", path, err)\n }\n }\n return nil\n })\n\n if err != nil {\n fmt.Printf("Erreur lors du parcours du répertoire : %v\\n", err)\n }\n}\n\n\nCe code est un excellent exemple de la façon d'automatiser des tâches en Go sans bibliothèques superflues. Le package intégré filepath parcourt récursivement les dossiers, et os.Remove libère de l'espace. Une fois compilé, vous obtenez un binaire qui peut être exécuté via cron sur n'importe quel serveur.
2. Requêtes HTTP et analyse d'API
\n\nSupposons que vous deviez surveiller l'état de plusieurs microservices ou analyser des données provenant d'une API externe. Go, avec ses goroutines, gère cela brillamment. Écrivons un script qui vérifie la disponibilité de sites et envoie une notification si quelque chose tombe en panne. C'est un autre exemple puissant d'automatisation 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("[ÉCHEC] %s - %v\\n", url, err)\n return\n }\n defer resp.Body.Close()\n\n if resp.StatusCode != http.StatusOK {\n fmt.Printf("[ATTENTION] %s - statut : %d\\n", url, resp.StatusCode)\n } else {\n fmt.Printf("[OK] %s - fonctionne\\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) // Lancement dans une goroutine\n }\n\n wg.Wait() // Attente de la fin de toutes les goroutines\n fmt.Println("Vérification terminée.")\n}\n\n\nNotez l'utilisation de s