Projets pratiques
Créer un outil en ligne de commande (CLI)
Go est un langage idéal pour développer des outils en ligne de commande (CLI) en raison de sa simplicité et de sa rapidité d’exécution. Dans cette section, nous allons explorer comment créer un CLI de base et utiliser des bibliothèques comme cobra pour des fonctionnalités avancées.
1. Création d’un CLI simple
Le langage Go permet de créer des outils en ligne de commande efficaces et performants. Un programme en ligne de commande peut recevoir des paramètres, effectuer des traitements et afficher des résultats. L’utilisation du package flag permet de gérer les arguments fournis par l’utilisateur. Ce dernier est adapté pour des CLI simples mais présente toutefois des limitations pour des projets plus complexes.
a. Initialisation du projet CLI
Avant de commencer, il est recommandé d’organiser correctement le projet. Créons un dossier spécifique pour notre application CLI :
mkdir mycli
cd mycli
go mod init mycli
Cette structure garantit une bonne gestion des modules Go et évite les conflits de dépendances.
b. Implémentation d’un CLI de base
Un programme CLI simple peut accepter plusieurs types d’arguments.
L’appel à la fonction flag.Parse() avant toute logique de traitement est une bonne pratique car elle analyse les arguments fournis par l’utilisateur. L’exemple suivant permet à l’utilisateur de fournir un nom et un âge en argument :
package main
import (
"flag"
"fmt"
)
func main() {
// Définition des options en ligne de commande
name := flag.String("name", "user", "Nom de l'utilisateur")
age := flag.Int("age", 25, "Âge de l'utilisateur")
height := flag.Float64("height", 1.75, "Taille en mètres")
verbose := flag.Bool("verbose", false, "Activer le mode verbeux")
// Analyse des arguments fournis
flag.Parse()...Utilisation du package flag
Le package flag de Go permet de gérer les arguments passés en ligne de commande de manière simple et efficace. Il est couramment utilisé pour créer des outils CLI (Command Line Interface) nécessitant des options et des paramètres configurables.
1. Introduction au package flag
Le package flag fournit une API pour définir des options sous forme de flags, les analyser et les utiliser dans le programme. Ces options permettent d’ajouter des configurations dynamiques sans modifier le code source.
2. Déclaration et utilisation des flags
L’utilisation de flags permet de rendre un programme en ligne de commande plus flexible en permettant aux utilisateurs de passer des paramètres personnalisés sans modifier le code source. Le package flag de Go permet de définir et de manipuler différents types de flags, facilitant ainsi la configuration des applications CLI.
a. Définition de flags de base
Le package flag permet de déclarer des options en ligne de commande avec une syntaxe simple. Voici un exemple de programme acceptant plusieurs types de flags :
package main
import (
"flag"
"fmt"
)
func main() {
// Définition des flags
name := flag.String("name", "user", "Nom de l'utilisateur")
age := flag.Int("age", 25, "Âge de l'utilisateur")
verbose := flag.Bool("verbose", false, "Activer le mode verbeux")
percentage := flag.Float64("percentage", 50.5, "Pourcentage
d'achèvement")
// Analyse des flags fournis
flag.Parse()
// Affichage des valeurs
fmt.Printf("Nom : %s\n", *name)
fmt.Printf("Âge : %d\n", *age)
fmt.Printf("Pourcentage : %.2f%%\n", *percentage)
if *verbose {
fmt.Println("Mode verbeux activé...Cas pratique : automatiser une tâche répétitive
L’automatisation de tâches répétitives est un des cas d’utilisation les plus courants des scripts en ligne de commande. Un programme CLI bien conçu peut exécuter des actions de manière autonome à intervalles réguliers, sans intervention manuelle. Dans cet exemple, nous allons créer un outil en Go qui surveille un site web et enregistre son statut dans un fichier journal.
1. Objectif du projet
L’objectif est de développer un programme capable de :
-
Vérifier la disponibilité d’un site web à intervalle régulier.
-
Enregistrer les résultats dans un fichier log.
-
Gérer les erreurs et les délais d’attente pour éviter les blocages.
-
Permettre à l’utilisateur de configurer l’URL et l’intervalle de vérification.
2. Structure du projet
Avant d’implémenter le programme, il est essentiel d’organiser correctement les fichiers pour assurer une meilleure lisibilité et évolutivité du projet. Une bonne structure facilite l’ajout de nouvelles fonctionnalités et la gestion des logs générés par le programme.
a. Organisation des fichiers
Le projet est structuré de manière à séparer clairement le code source, les fichiers journaux et les configurations éventuelles. Voici la structure recommandée :
automated-task/
├── cmd/
│ ├── root.go # Commande principale du CLI
│ ├── monitor.go # Gestion de la surveillance des sites
├── logs/
│ ├── status.log # Fichier contenant les logs des vérifications
├── internal/
│ ├── checker.go # Fonction de vérification des sites
│ ├── logger.go # Gestion de l'écriture dans les fichiers logs
├── main.go #...Développer une application web
Go est un langage performant et efficace pour le développement d’applications web. Son package natif net/http permet de créer des serveurs web légers et rapides sans dépendance externe. Cette section explore la création d’une application web en Go en suivant une architecture modulaire et extensible.
1. Initialisation du projet
Avant de commencer le développement, il est important de structurer correctement le projet.
mkdir web-app
cd web-app
go mod init web-app
mkdir templates static handlers
Structure recommandée :
web-app/
├── main.go # Point d'entrée de l'application
├── go.mod # Gestion des dépendances
├── handlers/
│ ├── home.go # Gestion de la page d'accueil
│ ├── about.go # Gestion de la page "À propos"
├── templates/
│ ├── layout.html # Template principal
│ ├── home.html # Page d'accueil
│ ├── about.html # Page "À propos"
├── static/
│ ├── styles.css # Feuille de style CSS
│ ├── script.js # Scripts côté client
2. Mise en place du serveur HTTP
Une application web repose sur un serveur HTTP capable de gérer les requêtes entrantes et de répondre aux clients de manière efficace. L’implémentation doit être flexible pour permettre l’ajout de nouvelles routes et la gestion des erreurs.
a. Définition des routes principales
Le serveur doit pouvoir traiter plusieurs requêtes et fournir les réponses appropriées...
Construire un serveur web avec gestion des requêtes
Un serveur web doit être capable de traiter plusieurs types de requêtes HTTP, définir des routes personnalisées et gérer les données envoyées par les utilisateurs. Une bonne implémentation inclut la gestion des requêtes GET et POST, la validation des entrées, ainsi qu’une structure modulaire pour faciliter l’extension de l’application.
1. Initialisation du projet
Avant de développer le serveur, l’organisation des fichiers est essentielle pour maintenir un code propre et évolutif.
mkdir web-server
cd web-server
go mod init web-server
mkdir handlers middlewares
Structure recommandée :
web-server/
├── main.go # Point d'entrée du serveur
├── go.mod # Gestion des dépendances
├── handlers/
│ ├── home.go # Gestion de la page d'accueil
│ ├── user.go # Gestion des utilisateurs
├──...Ajouter des tests et déployer
Une application Go bien structurée doit inclure des tests unitaires et une stratégie de déploiement efficace. Dans cette section, nous allons voir comment tester notre application et la déployer sur un serveur.
1. Ajouter des tests unitaires
L’ajout de tests unitaires est une étape essentielle pour garantir la fiabilité et la stabilité d’une application. Un bon système de tests permet d’identifier rapidement les erreurs, d’assurer la non-régression du code et de faciliter l’ajout de nouvelles fonctionnalités.
a. Structure des tests dans un projet
Les fichiers de tests sont placés à côté des fichiers sources et portent le suffixe _test.go. Cette convention permet au framework de test de Go de les détecter et de les exécuter automatiquement.
Organisation des fichiers :
myproject/
├── handlers/
│ ├── home.go
│ ├── home_test.go # Fichier de test pour home.go
├── utils/
│ ├── math.go
│ ├── math_test.go # Fichier de test pour math.go
├── main.go
Cette structure permet d’organiser clairement les tests et de faciliter leur maintenance.
b. Écrire un premier test unitaire
L’exemple suivant teste une fonction simple d’addition contenue dans un module utils/math.go.
Fichier math.go
package utils
// Add additionne deux nombres et retourne le résultat
func Add(a, b int) int {
return a + b
}
Fichier math_test.go
package utils
import (
"testing"
)
// Test de la fonction Add
func TestAdd(t *testing.T) {
result := Add(2, 3)
expected := 5
if result != expected {...