1. Livres & vidéos
  2. Golang
  3. Projets pratiques
Extrait - Golang Les fondamentaux du langage de Google
Extraits du livre
Golang Les fondamentaux du langage de Google Revenir à la page d'achat du livre

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 {...