Très bon livre.
pierre cGolang Les fondamentaux du langage de Google
Les points forts du livre :
- Un apprentissage progressif du langage Go, depuis les fondamentaux jusqu’aux notions avancées telles que les interfaces, la gestion des erreurs et la concurrence avec goroutines et canaux,
- Une mise en pratique complète du développement backend : création de serveurs HTTP, conception d’API REST, accès aux bases de données et utilisation d’ORM comme GORM,
- Des projets concrets et bonnes pratiques professionnelles (tests, benchmarks, profiling, microservices et conteneurisation avec Docker) pour développer des applications performantes et robustes
- Niveau Initié à Confirmé
- Nombre de pages 445 pages
- Parution février 2026
- Niveau Initié à Confirmé
- Parution février 2026
Ce livre propose un apprentissage progressif du langage Go, langage conçu par Google pour allier performance, simplicité et gestion native de la concurrence dans le développement d’applications. Il s’adresse aux développeurs déjà familiers avec un langage comme Python, JavaScript, Java ou C, ainsi qu’aux apprenants et professionnels souhaitant élargir leurs compétences vers le développement backend, les microservices ou les outils systèmes.
L’ouvrage guide le lecteur depuis la découverte du langage jusqu’à la réalisation de projets concrets. Il présente d’abord les origines et la philosophie de Go, puis accompagne l’installation de l’environnement et la création d’un premier programme. Les chapitres suivants couvrent les bases du langage (types de données, variables, structures de contrôle, fonctions, tableaux et maps) avant d’aborder des notions avancées telles que struct, interfaces, pointeurs et gestion des erreurs.
Le développement web est ensuite exploré à travers la mise en place d’un serveur HTTP, la gestion des requêtes et réponses, la sérialisation JSON et l’utilisation de frameworks comme Gin ou Echo pour construire une API REST. Le livre traite également de la manipulation de fichiers, de l’accès aux bases de données relationnelles et de l’utilisation d’ORM tels que GORM. La gestion de la concurrence est expliquée avec les goroutines, les canaux et les mécanismes de synchronisation, illustrée par un serveur concurrent.
L’organisation et le test du code sont abordés avec les packages, la documentation, les tests unitaires, les benchmarks et le profiling. Plusieurs projets pratiques, comme un outil en ligne de commande, un serveur web ou un système d’automatisation, permettent de mettre en application les notions apprises. Le livre propose enfin une ouverture vers les microservices et l’intégration avec Docker pour approfondir ses compétences.
En combinant théorie, pratique et bonnes pratiques professionnelles, ce livre constitue à la fois un guide d’apprentissage et une référence durable pour tout développeur souhaitant maîtriser Go.
Caractéristiques
- Livre (broché) - 17 x 21 cm
- ISBN : 978-2-409-05295-8
- EAN : 9782409052958
- Ref. ENI : RIGOLANG
Caractéristiques
- HTML
- ISBN : 978-2-409-05296-5
- EAN : 9782409052965
- Ref. ENI : LNRIGOLANG
Avant-propos
- Introduction
- Objectifs du livre
- À qui ce livre est-il destiné ?
- Pourquoi apprendre Go ?
- Progressivité de l’ouvrage
Introduction au langage Go
- Origines et philosophie du langage
- 1. Les origines de Go
- a. La genèse du projet
- b. Premières étapes du développement
- c. L’ouverture au public et l’évolutionde Go
- 1. Les origines de Go
- 2. La philosophie du langage
- a. Simplicité et lisibilité
- b. Compilation rapide et efficacité
- c. Concurrence et performance
- d. Un langage pragmatique et productif
- e. Stabilité et compatibilité
- f. Un écosystème intégré etcohérent
- g. Une approche moderne du développement logiciel
- 3. Un langage conçu pour l’efficacité
- a. Performance et rapidité d’exécution
- b. Gestion efficace de la mémoire
- c. Un modèle de concurrence efficace
- d. Compilation et déploiement rapides
- e. Simplicité du code et maintenance optimisée
- f. Adaptabilité aux architectures modernes
- 1. Simplicité et minimalisme
- 2. Performance et efficacité
- 3. Conçu pour la concurrence
- 4. Support natif du développement en réseau
- 5. Stabilité et compatibilité
- 6. Un écosystème en pleine croissance
- 1. Go vs C
- a. Gestion de la mémoire
- b. Sécurité et gestion des erreurs
- c. Concurrence et parallélisme
- d. Compilation et portabilité
- e. Simplicité et expressivité du langage
- a. Paradigme et philosophie
- b. Performance et gestion des ressources
- c. Concurrence et exécution parallèle
- d. Typage et sécurité du code
- e. Écosystème et cas d’utilisation
- a. Modèle d’exécution et performances
- b. Gestion de la mémoire et ramasse-miettes
- c. Concurrence et scalabilité
- d. Typage et structure du langage
- e. Écosystème et cas d’utilisation
- 1. Organisation du code
- a. Structuration des fichiers et répertoires
- b. Organisation des packages
- c. Séparation des responsabilités
- d. Gestion des dépendances et versionnage
- e. Respect des conventions et formatage automatique
- a. Définition et rôle des packages
- b. Nomination et conventions des packages
- c. Importation et accessibilité des packages
- d. Packages standard et packages tiers
- e. Packages internes et encapsulation
- f. Optimisation de l’organisation des packages
- 1. Le compilateur Go
- 2. Compilation d’un programme Go
- a. Principe de la compilation
- b. Compilation simple d’un programme
- c. Compilation multiplateforme
- d. Compilation avec optimisation
- e. Exécution et vérification de l’exécutable
- f. Gestion des erreurs de compilation
- g. Compilation en mode verbeux
- a. Outil de gestion des dépendances
- b. Outil de formatage du code
- c. Outil d’analyse statique
- d. Outil de test
- e. Outil de génération de documentation
- f. Outil de profilage et d’analyse des performances
Installation et premiers pas
- Installation de Go sur votre système (Windows, macOS, Linux)
- 1. Installation sur Windows
- a. Télécharger Go
- b. Installer Go
- c. Vérifier l’installation
- 1. Installation sur Windows
- 2. Installation sur macOS
- a. Télécharger et installer Go
- b. Vérifier l’installation
- 3. Installation sur Linux
- a. Télécharger et extraire Go
- b. Configurer le chemin d’accès
- c. Vérifier l’installation
- 1. Comprendre GOPATH et GOROOT
- a. GOROOT : le répertoire d’installationde Go
- b. GOPATH : l’espace de travail Go
- c. L’impact de GOROOT et GOPATH sur un projetGo
- d. Tester la configuration
- a. Définir GOPATH
- b. Ajouter GOPATH/bin au PATH
- c. Tester la configuration avec un programme Go
- d. Résolution des problèmes courants
- a. Vérifier la version de Go
- b. Vérifier les variables d’environnement
- c. Tester la compilation d’un programme simple
- d. Tester l’installation d’un packageexterne
- e. Résolution des erreurs fréquentes
- 1. Écrire un programme de base
- a. Structure d’un programme Go
- b. Exécuter le programme
- c. Compiler un exécutable
- a. Comprendre go run
- b. Tester un programme avec Go run
- c. Exécution du programme
- d. Différence entre go run et go build
- a. Compilation avec go build
- b. Vérification de l’exécutable
- c. Compilation multiplateforme
- d. Optimisation de la compilation
- e. Résolution des erreurs possibles
- 1. Initialiser un projet avec go mod
- a. Pourquoi utiliser go mod ?
- b. Création d’un projet avec go mod
- c. Ajouter des dépendances
- d. Mettre à jour et gérer les dépendances
- e. Vérifier les dépendances
- f. Résolution des erreurs courantes
- a. Détection implicite via l’importation depackages
- b. Ajout explicite d’une bibliothèquevia la commande go get
- c. Verrouillage de version
- d. Réaliser un audit minimal des dépendances
- a. Mettre à jour les dépendances avecla commande go get -u ./...
- b. Harmonisation des dépendances avec go modtidy
- 1. Compilation avec go build
- a. Usage fondamental dans un projet local
- b. Compilation ciblée d’un fichiersource
- c. Bonnes pratiques liées à go build
- a. Conception d’un test basique
- b. Lancement des tests dans un projet
- a. Application du formatage sur un projet entier
- b. Intégration dans le flux de développement
- c. Limitations et compléments
Les bases du langage
- Types de données fondamentaux : entiers, flottants, booléens, chaînes de caractères
- 1. Types entiers
- a. Entiers signés
- b. Entiers non signés
- 1. Types entiers
- 2. Types flottants
- 3. Types booléens
- 4. Chaînes de caractères
- 5. Types spéciaux : byte et rune
- 6. Valeurs zéro
- 7. Conclusion sur les types de données fondamentaux
- 1. Déclaration de variables
- a. Déclaration explicite avec un type
- b. Déclaration et initialisation simultanées
- c. Déclaration de variables multiples
- a. Déclaration de constantes
- b. Constantes avec des types explicites
- c. Constantes de type iota
- a. Portée locale
- b. Portée globale
- c. Portée des variables avec :=
- d. Résumé des bonnes pratiques
- 1. La boucle for : l’unique boucle de Go
- a. La boucle for structurée : initialisation,condition, post-opération
- b. La boucle conditionnelle (équivalent implicitedu while)
- c. La boucle infinie contrôlée parbreak
- d. Utilisation de break et continue
- a. Condition simple avec if
- b. Bloc conditionnel if...else
- c. Chaînage conditionnel avec else if
- d. Initialisation locale dans la condition if
- e. Bonnes pratiques
- a. Syntaxe de base du switch
- b. Forçage d’exécution avec fallthrough
- c. Gestion de plusieurs valeurs dans un mêmecase
- d. Le switch sans expression : comparaison conditionnelle
- e. Conseils pratiques pour l’usage de switch
- 1. Tableaux (Arrays) : taille fixe et typée
- a. Déclaration et initialisation d’un tableau
- b. Accès et modification des éléments
- c. Longueur et itération
- a. Définition et initialisation de slices
- b. Comprendre la longueur et la capacité
- c. Ajout d’éléments avec append()
- d. Copie sécurisée entre slices aveccopy()
- a. Déclaration et création d’une map
- b. Lecture et vérification des clés
- c. Modification ou ajout d’entrées
- d. Suppression d’éléments
- e. Parcours d’une map
- 1. Syntaxe de base d’une fonction
- a. Décomposition de la déclaration
- b. Fonctions sans paramètres ni valeurs de retour
- c. Importance de l’ordre des éléments
- d. Bonnes pratiques de définition
- a. Structure générale
- b. Utilisation dans un contexte plus large
- c. Avantages
- a. Définir et utiliser des paramètres
- b. Simplification pour les types communs
- c. Fonctions avec plus de deux paramètres
- d. L’importance de l’ordre des paramètres
- e. Paramètres littéraux et variables
- a. Déclaration d’une fonction avec valeur deretour
- b. Utilisation directe du retour de fonction
- c. Remarques pratiques
- a. Exemple : division sécurisée
- b. Ignorer certaines valeurs de retour
- c. Cas d’usage avancé : extraction de données
- a. Exemple de fonction arithmétique avec retoursnommés
- b. Intérêt des retours nommés
- c. Exemple avec valeurs numériques détaillées
- d. Précautions à prendre
- a. Addition de plusieurs entiers
- b. Particularités et comportement
- c. Exemple avec plusieurs types de traitement
Les types complexes et la programmation structurée
- Structures (struct) : définir vos propres types
- 1. Déclaration d’une structure
- a. Définition et visibilité des structures
- b. Structures et types personnalisés
- c. Valeurs par défaut des structures
- 1. Déclaration d’une structure
- 2. Initialisation d’une structure
- a. Initialisation avec des valeurs explicites
- b. Allocation dynamique et pointeurs
- c. Initialisation avec une fonction constructeur
- 3. Accès et modification des champs
- a. Accès aux champs
- b. Modification des champs
- c. Modification des champs via une fonction
- d. Vérification de la validité desdonnées avant modification
- 4. Les structures par référence
- 1. Définition d’une interface
- a. Déclaration d’une interface
- b. Rôle des interfaces dans Go
- c. Interfaces avec plusieurs méthodes
- d. Utilisation d’une interface comme paramètrede fonction
- a. Implémentation implicite d’une interface
- b. Implémentation par plusieurs structures
- c. Vérification d’implémentationd’une interface
- d. Utilisation des interfaces dans les fonctions
- a. Passage d’une interface en paramètre
- b. Stockage de plusieurs types dans une collection
- c. Conversion de type avec assertion
- a. Déclaration et utilisation d’uneinterface vide
- b. Passage d’une interface vide en paramètre
- c. Type assertion pour récupérer lavaleur d’une interface vide
- d. Type switch pour gérer plusieurs types dynamiquement
- e. Limites et bonnes pratiques
- 1. Déclaration et utilisation des pointeurs
- a. Déclaration d’un pointeur
- b. Initialisation d’un pointeur
- c. Accès et modification via un pointeur
- d. Passage de pointeurs en argument de fonction
- a. Modification d’une variable à travers unpointeur
- b. Passage d’un pointeur en paramètre de fonction
- c. Utilisation des pointeurs pour échanger deuxvaleurs
- a. Déclaration d’un pointeur vers une structure
- b. Modification des champs via un pointeur
- c. Passage d’une structure par pointeur à unefonction
- d. Allocation dynamique avec new
- e. Vérification d’un pointeur nil
- a. Déclaration d’un pointeur nil
- b. Initialisation conditionnelle d’un pointeur
- c. Utilisation des pointeurs nil dans une structure
- d. Prévention des erreurs liées auxpointeurs nil
- 1. Principe de gestion des erreurs en Go
- a. Retour d’erreur avec le type error
- b. Vérification et traitement des erreurs
- c. Création d’erreurs personnalisées
- d. Ajout de contexte aux erreurs
- a. Vérification des erreurs après unappel de fonction
- b. Gestion des erreurs avec log.Fatal
- c. Renvoyer une erreur à l’appelant
- d. Utilisation des erreurs retournées dans uneboucle
- a. Création d’erreurs avec le package errors
- b. Ajout de contexte aux erreurs avec fmt.Errorf
- c. Comparaison des erreurs avec errors.Is
- d. Extraction d’informations avec errors.As
- a. Comparaison des erreurs avec errors.Is
- b. Extraction des erreurs avec errors.As
- c. Combinaison de errors.Is et errors.As
- a. Utilisation de panic
- b. Capture d’une panique avec recover
- c. Bonnes pratiques pour l’utilisation de panic et recover
Développement web avec Go
- Créer un serveur HTTP simple avec le package net/http
- 1. Mise en place d’un serveur HTTP minimal
- a. Définition de la structure du serveur
- b. Explications et bonnes pratiques
- 1. Mise en place d’un serveur HTTP minimal
- 2. Tester le serveur
- a. Démarrer le serveur
- b. Vérification avec un navigateur
- c. Tester avec curl
- d. Utilisation de Postman
- e. Écriture de tests automatisés
- f. Analyse des logs du serveur
- 3. Ajouter des routes personnalisées
- a. Définition de plusieurs routes
- b. Tester les nouvelles routes
- c. Organisation des routes dans un routeur personnalisé
- 4. Gestion des méthodes HTTP
- a. Différenciation des méthodes HTTP
- b. Tester les différentes méthodes
- c. Restriction d’accès à certainesméthodes
- d. Gestion avancée avec un routeur personnalisé
- 5. Gestion des paramètres de requête
- a. Récupération des paramètresde requête
- b. Tester les paramètres de requête
- c. Récupération de plusieurs paramètres
- d. Validation des paramètres
- e. Utilisation des valeurs par défaut
- 1. Récupérer les informations d’unerequête HTTP
- a. Lire la méthode HTTP
- b. Lire les en-têtes de requête
- c. Lire les paramètres de l’URL
- d. Lire le corps de la requête
- a. Envoyer une réponse simple
- b. Définir un statut HTTP personnalisé
- c. Ajouter des en-têtes HTTP
- d. Gérer les redirections HTTP
- e. Structurer une réponse JSON
- 1. Convertir une structure en JSON
- a. Sérialisation d’une structure simple
- b. Formatage du JSON pour la lisibilité
- c. Ignorer des champs lors de la conversion
- d. Gérer les erreurs de sérialisation
- a. Désérialisation d’un JSONsimple
- b. Gérer des valeurs absentes ou nulles
- c. Désérialisation d’un tableauJSON
- d. Gérer les erreurs de conversion
- a. Sérialisation d’une liste de structures
- b. Formatage du JSON pour une meilleure lisibilité
- c. Gestion des valeurs vides
- d. Sérialisation et réponse HTTP
- e. Tester la sérialisation avec curl
- a. Gestion des erreurs de sérialisation
- b. Gestion des erreurs de désérialisation
- c. Vérification des champs obligatoires
- d. Gérer les erreurs dans une API
- a. Détection des valeurs nulles dans un JSON
- b. Utilisation des pointeurs pour gérer leschamps optionnels
- c. Sérialisation en excluant les valeurs nulles
- d. Gestion avancée avec sql.NullString
- e. Vérification et manipulation des valeursnulles
- 1. Gin : un framework performant et minimaliste
- a. Installation de Gin
- b. Création d’un serveur avec Gin
- c. Gestion des routes avec des paramètres
- d. Gestion des requêtes POST
- e. Middleware dans Gin
- a. Installation de Echo
- b. Création d’un serveur avec Echo
- c. Gestion des routes dynamiques
- d. Gestion des requêtes POST
- e. Middleware dans Echo
- 1. Installation et structure du projet
- 2. Définition du modèle et des données
- 3. Implémentation des routes CRUD
- a. Récupérer tous les articles
- b. Récupérer un article par son ID
- c. Ajouter un nouvel article
- d. Modifier un article existant
- e. Supprimer un article
Gestion des fichiers et des bases de données
- Lire et écrire dans des fichiers
- 1. Lire un fichier
- a. Lire un fichier en entier
- b. Lire un fichier ligne par ligne
- c. Lire un fichier par blocs
- d. Lire un fichier avec un buffer personnalisé
- 1. Lire un fichier
- 2. Écrire dans un fichier
- a. Écrire dans un fichier en remplaçantson contenu
- b. Ajouter du texte à un fichier existant
- c. Écrire ligne par ligne
- d. Écrire dans un fichier avec un buffer
- 1. Créer un répertoire
- a. Créer un répertoire simple
- b. Créer un répertoire avec des sous-dossiers
- c. Vérifier si un répertoire existeavant de le créer
- d. Créer un répertoire avec des permissionsspécifiques
- a. Lister les noms des fichiers d’un répertoire
- b. Lister les fichiers avec leurs informations détaillées
- c. Lister uniquement les fichiers et exclure les répertoires
- d. Lister uniquement les répertoires
- e. Lister les fichiers d’un répertoireavec une extension spécifique
- a. Supprimer un fichier
- b. Supprimer un répertoire vide
- c. Supprimer un répertoire et son contenu
- d. Vérifier si un fichier ou un répertoireexiste avant suppression
- e. Supprimer plusieurs fichiers d’un répertoire
- a. Renommer un fichier
- b. Déplacer un fichier vers un autre répertoire
- c. Vérifier l’existence d’un fichier avant dele renommer ou le déplacer
- d. Gérer le déplacement entre différentssystèmes de fichiers
- a. Vérifier si un fichier existe
- b. Vérifier si un répertoire existe
- c. Différencier un fichier d’un répertoire
- d. Vérifier si un fichier est accessible enlecture et en écriture
- e. Vérifier l’existence de plusieursfichiers à la fois
- 1. Installation d’un pilote SQL
- a. Installer un pilote SQL pour MySQL
- b. Installer un pilote SQL pour PostgreSQL
- c. Installer un pilote SQL pour SQLite
- d. Vérifier l’installation du pilote
- e. Résolution des erreurs courantes
- a. Établir une connexion à une basede données MySQL
- b. Connexion à une base de donnéesPostgreSQL
- c. Connexion à une base de donnéesSQLite
- d. Gestion des erreurs de connexion
- e. Gérer une connexion avec un pool de connexions
- a. Exécuter une requête SQL pour créerune table
- b. Insérer des données dans une table
- c. Lire des données d’une table
- d. Mettre à jour des données
- e. Supprimer un enregistrement
- f. Gérer les erreurs et les transactions
- 1. Pourquoi utiliser GORM ?
- 2. Installation de GORM
- a. Installer GORM et un pilote de base de données
- b. Vérifier l’installation de GORM
- c. Vérification de la configuration des dépendances
- d. Détection et correction des erreurs courantes
- a. Connexion à une base de donnéesMySQL avec GORM
- b. Connexion à une base de donnéesPostgreSQL
- c. Connexion à une base de donnéesSQLite
- d. Gestion des erreurs de connexion
- e. Configuration du pool de connexions
- a. Définir un modèle simple
- b. Ajout d’options avancées aux modèles
- c. Définir des relations entre les modèles
- d. Automatiser la création des tables avec GORM
- a. Utiliser AutoMigrate pour créer les tables
- b. Ajouter de nouvelles colonnes avec AutoMigrate
- c. Attention aux limitations de AutoMigrate
- d. Exécuter des migrations SQL personnalisées
- a. Création d’un enregistrement (Create)
- b. Lecture des enregistrements (Read)
- c. Mise à jour d’un enregistrement(Update)
- d. Suppression d’un enregistrement (Delete)
- e. Gestion avancée des transactions
- a. Relation One-to-One (Un à Un)
- b. Relation One-to-Many (Un à Plusieurs)
- c. Relation Many-to-Many (Plusieurs à Plusieurs)
- d. Charger les relations avec GORM
- e. Gestion avancée des relations
- a. Avantages
- b. Inconvénients
Concurrence et parallélisme
- Introduction à la concurrence en Go
- 1. Pourquoi la concurrence est-elle importante ?
- 2. Les goroutines
- 3. Synchronisation avec les channels
- 4. Utilisation de sync.WaitGroup
- Les goroutines : exécution parallèle simplifiée
- 1. Qu’est-ce qu’une goroutine ?
- 2. Lancer une goroutine
- a. Création et exécution d’une goroutine
- b. Explication du comportement
- c. Gestion des goroutines multiples
- d. Points clés à retenir
- e. Comparaison avec un appel synchrone
- f. Cas d’utilisation des goroutines
- 3. Lancer plusieurs goroutines
- a. Exécution concurrente de plusieurs goroutines
- b. Explication du comportement
- c. Passage d’arguments dans une goroutine
- d. Pourquoi passer les arguments de manièreexplicite ?
- e. Synchronisation des goroutines multiples
- f. Points clés à retenir
- 4. Synchronisation des goroutines
- a. Introduction à sync.WaitGroup
- b. Utilisation des channels pour la synchronisation
- c. Utilisation de sync.Mutex pour protéger lesdonnées partagées
- d. Quand utiliser quel mécanisme ?
- 1. Création et utilisation de base d’un channel
- 2. Utilisation des channels bufferisés
- 3. Fermeture d’un channel
- 4. Synchronisation avec un channel de signalisation
- 5. Utilisation des channels pour coordonner plusieursgoroutines
- 6. Comparaison entre différents mécanismesde synchronisation
- 1. Problèmes liés aux accèsconcurrents
- 2. Utilisation des mutex (sync.Mutex)
- a. Principe de fonctionnement d’un mutex
- b. Exemple d’utilisation d’un mutex
- c. Risques liés à l’utilisation desmutex
- d. Alternative : utilisation de sync.RWMutex
- e. Bonnes pratiques d’utilisation des mutex
- a. Introduction aux opérations atomiques
- b. Exemple d’incrémentation atomique
- c. Comparaison entre mutex et opérations atomiques
- d. Chargement et stockage atomique
- e. Opérations de comparaison et d’échange
- f. Quand utiliser les opérations atomiques ?
- a. Synchronisation simple avec un channel
- b. Utilisation d’un channel pour coordonner plusieursgoroutines
- c. Fermeture d’un channel pour signaler la findes opérations
- d. Comparaison entre channels et autres mécanismesde synchronisation
- 1. Mise en place d’un serveur HTTP simple
- 2. Amélioration avec un pool de travailleurs
- 3. Gestion des délais et des erreurs
- 4. Optimisation avec un serveur HTTP concurrent efficace
- 5. Résumé des bonnes pratiques
Structurer et tester son code
- Organisation d’un projet Go : packages, modules et dépendances
- 1. Structure d’un projet Go
- a. Organisation des fichiers et répertoires
- b. Rôle des répertoires
- c. Séparation du code applicatif et des bibliothèques
- d. Gestion des exécutables
- 1. Structure d’un projet Go
- 2. Modules en Go
- a. Définition et rôle des modules
- b. Initialisation d’un module
- c. Gestion des dépendances
- d. Mise à jour et suppression des dépendances
- e. Versionnement des modules
- f. Remplacement de modules locaux
- g. Exportation d’un module
- 3. Organisation des packages
- a. Définition et structuration des packages
- b. Importation et utilisation des packages
- c. Packages internes et encapsulation
- d. Organisation recommandée des packages
- e. Gestion des dépendances entre packages
- f. Meilleures pratiques pour organiser les packages
- 4. Gestion des dépendances
- a. Introduction aux dépendances
- b. Ajouter une nouvelle dépendance
- c. Fixer une version spécifique
- d. Supprimer des dépendances inutilisées
- e. Vérifier l’intégrité desdépendances
- f. Remplacer une dépendance locale
- g. Désactiver la gestion des modules
- h. Meilleures pratiques pour la gestion des dépendances
- 1. Écrire des commentaires compatibles avecgodoc
- a. Principes de base des commentaires
- b. Commenter un package
- c. Commenter une fonction
- d. Commenter une structure et ses champs
- e. Commenter une méthode
- f. Commenter des constantes et des variables globales
- g. Exemples d’utilisation pour la documentation
- h. Meilleures pratiques pour la documentation
- a. Installation et configuration de godoc
- b. Démarrer un serveur de documentation local
- c. Afficher la documentation d’un package spécifique
- d. Ajouter des descriptions détaillées
- e. Générer la documentation d’unprojet privé
- f. Exporter la documentation pour un partage externe
- g. Meilleures pratiques pour l’affichage dela documentation
- a. Documentation des structures imbriquées
- b. Afficher la documentation spécifique d’unestructure ou méthode
- c. Meilleures pratiques pour la documentation des structureset méthodes
- 1. Pourquoi écrire des tests unitaires ?
- 2. Structure d’un test en Go
- a. Organisation des fichiers de test
- b. Définition d’un test unitaire
- c. Utilisation de t.Errorf pour afficher les erreurs
- d. Exécution des tests
- e. Affiche un rapport des tests réussis ou échoués
- f. Organisation des tests avec t.Run
- g. Meilleures pratiques pour écrire des testsunitaires
- a. Exécuter les tests d’un packagespécifique
- b. Exécution détaillée avecl’option -v
- c. Exécuter un test précis
- d. Désactiver la mise en cache des tests
- e. Exécuter les tests avec des variables d’environnement
- f. Intégration des tests dans un pipeline CI/CD
- g. Meilleures pratiques pour l’exécutiondes tests
- a. Pourquoi utiliser t.Run() ?
- b. Exemple simple d’utilisation de t.Run()
- c. Structurer les tests avec une boucle
- d. Exécution ciblée d’un sous-test
- e. Exécution parallèle des sous-tests
- f. Meilleures pratiques pour l’utilisation det.Run()
- 1. Qu’est-ce qu’un benchmark ?
- 2. Écrire un benchmark en Go
- a. Structure d’un benchmark
- b. Comparer plusieurs implémentations
- c. Benchmark avec allocation mémoire
- d. Exécuter un benchmark avec différentestailles d’entrée
- e. Optimisation après benchmark
- a. Commande de base pour exécuter un benchmark
- b. Exécuter un benchmark spécifique
- c. Afficher des résultats détaillés
- d. Exécuter un benchmark avec une duréespécifique
- e. Comparer plusieurs exécutions avec -count
- f. Désactiver la mise en cache des benchmarks
- g. Utiliser pprof pour un profilage avancé
- h. Meilleures pratiques pour l’exécutiondes benchmarks
- 1. Activer pprof dans un serveur Go
- a. Ajouter pprof à un serveur HTTP
- b. Accéder aux endpoints de pprof
- c. Capturer un profil CPU via la ligne de commande
- d. Analyser l’utilisation mémoire
- e. Afficher un profil en mode interactif
- f. Protéger l’accès aux profils
- g. Meilleures pratiques pour l’utilisation depprof
- a. Capturer un profil CPU en mode serveur
- b. Analyser un profil CPU avec pprof
- c. Capturer un profil CPU dans un programme Go
- d. Visualiser un profil CPU en mode graphique
- e. Identifier les fonctions lentes
- f. Comparer plusieurs profils CPU
- g. Meilleures pratiques pour l’analyse CPU
- a. Capturer un profil mémoire via un serveurHTTP
- b. Analyser un profil mémoire avec pprof
- c. Capturer un profil mémoire dans un programme
- d. Identifier les fuites de mémoire
- e. Comparer plusieurs captures mémoire
- f. Visualiser le profil mémoire avec une interfacegraphique
- g. Meilleures pratiques pour l’analyse mémoire
- a. Générer un profil d’exécution
- b. Lancer l’interface graphique de pprof
- c. Afficher un graphe des performances
- d. Explorer les statistiques dans l’interfaceweb
- e. Générer un Flame Graph
- f. Comparer plusieurs profils
- g. Meilleures pratiques pour la visualisation avec pprof
Projets pratiques
- Créer un outil en ligne de commande (CLI)
- 1. Création d’un CLI simple
- a. Initialisation du projet CLI
- b. Implémentation d’un CLI de base
- c. Analyse du code
- d. Exécution du programme
- 1. Création d’un CLI simple
- 2. Utilisation de cobra pour un CLI avancé
- a. Installation de Cobra et initialisation du projet
- b. Structure du projet
- c. Implémentation d’une commande personnalisée
- d. Exécution du CLI
- e. Ajout d’options à une commande
- 3. Ajout de commandes personnalisées
- a. Ajout d’une commande personnalisée time
- b. Exécution de la nouvelle commande
- c. Ajout d’options à une commande personnalisée
- d. Exécution avec des options
- e. Documentation et aide
- 1. Introduction au package flag
- 2. Déclaration et utilisation des flags
- a. Définition de flags de base
- b. Exécution avec différents arguments
- c. Gestion des flags obligatoires
- d. Récupération des arguments non traités
- a. Flags booléens
- b. Flags numériques
- c. Flags de type durée
- a. Récupération des arguments non flag
- b. Vérification du nombre d’argumentsnon flag
- c. Traitement des arguments non flag comme fichiers
- 1. Objectif du projet
- 2. Structure du projet
- a. Organisation des fichiers
- b. Rôle des principaux fichiers
- a. Initialisation du projet
- b. Définition des paramètres configurables
- c. Réalisation de la vérification web
- d. Implémentation du système de tentatives
- e. Enregistrement des logs
- f. Exécution en boucle
- g. Test du programme
- 1. Initialisation du projet
- 2. Mise en place du serveur HTTP
- a. Définition des routes principales
- b. Gestion des erreurs HTTP
- c. Utilisation des middlewares pour le logging
- d. Configuration d’un serveur avec timeout
- a. Définition des gestionnaires de routes
- b. Rendu dynamique avec des templates
- c. Chargement efficace des templates
- a. Ajout d’une route pour le formulaire
- b. Conception du formulaire HTML
- c. Validation des entrées utilisateur
- d. Redirection et confirmation
- e. Gestion des erreurs et affichage des messages
- 1. Initialisation du projet
- 2. Mise en place du serveur HTTP
- 3. Gestion des requêtes GET et POST
- a. Traitement des requêtes GET
- b. Traitement des requêtes POST
- 1. Ajouter des tests unitaires
- a. Structure des tests dans un projet
- b. Écrire un premier test unitaire
- c. Exécution des tests
- d. Tester un gestionnaire HTTP
- e. Utilisation de t.Run pour structurer plusieurs casde test
- a. Compilation et optimisation du binaire
- b. Transfert du binaire vers le serveur distant
- c. Exécution en arrière-plan avec systemd
- d. Conteneurisation avec Docker
- e. Surveillance et journaux
- f. Mises à jour et redéploiement
Aller plus loin avec Go
- Go pour les microservices
- 1. Pourquoi utiliser Go pour les microservices ?
- 2. Mise en place du microservice
- a. Préparation de l’environnement
- b. Organisation des fichiers
- c. Mise en place des dépendances
- d. Définition des routes
- e. Lancer le serveur
- 3. Développement du microservice
- a. Implémentation des gestionnaires de requêtes
- b. Séparation de la logique métier
- c. Ajout d’une nouvelle ressource
- d. Lancer et tester le microservice
- 1. Pourquoi utiliser Docker pour Go ?
- 2. Étape 1 : création d’une applicationGo simple
- a. Initialisation du projet
- b. Création du fichier principal
- c. Compilation et exécution
- d. Ajout d’une interaction utilisateur
- e. Organisation en modules
- f. Test et validation
- a. Choix de l’image de base
- b. Configuration du répertoire de travail
- c. Copie des fichiers et gestion des dépendances
- d. Compilation de l’application
- e. Optimisation de l’image Docker
- f. Validation du Dockerfile
- a. Génération de l’image Docker
- b. Lancement du conteneur
- c. Inspection et suivi du conteneur
- d. Gestion du cycle de vie du conteneur
- e. Nettoyage des ressources Docker
- a. Définition des variables d’environnementdans Docker
- b. Lecture des variables d’environnement dansGo
- c. Validation des variables d’environnement
- d. Sécurisation des variables d’environnement
- e. Suppression des variables après exécution
- 1. Gestion des dépendances avec go mod
- a. Initialisation d’un module Go
- b. Ajout et gestion des dépendances
- c. Gestion des versions des dépendances
- d. Vérification et correction des dépendances
- e. Utilisation des vendored dependencies
- f. Bonnes pratiques pour la gestion des dépendances
- a. Présentation des outils d’analysestatique
- b. Utilisation de go vet
- c. Vérification du style avec golint
- d. Détection des erreurs avec staticcheck
- e. Optimisation du formatage avec gofmt et goimports
- f. Intégration dans un workflow de CI/CD
- g. Bonnes pratiques pour une analyse efficace
- a. Organisation des tests
- b. Approfondissement des assertions et cas limites
- c. Exécution et analyse des tests
- d. Mesure de la couverture du code
- e. Mocks et tests unitaires avancés
- f. Tests de performance
- a. Activation de pprof dans une application
- b. Analyse des profils CPU
- c. Profilage de l’utilisation mémoire
- d. Visualisation avec pprof et go tool
- e. Optimisation basée sur les résultatsde profilage
- f. Automatisation du profilage en production
- a. Compilation multiplateforme
- b. Optimisation du binaire
- c. Inclusion des ressources statiques
- d. Signature et validation de l’exécutable
- e. Automatisation du processus de distribution
- 1. Documentation officielle
- 2. Cours et tutoriels en ligne
- 3. Communauté et forums
- 4. Projets open-source et contributions
- 5. Conférences et événements
Louis LAUGIER
Louis LAUGIER est développeur freelance, spécialisé dans la conception d’applications web et d’outils logiciels. Passionné par les langages modernes et les environnements performants, il accompagne ses clients dans la réalisation de solutions robustes, évolutives et maintenables. Fort d’une expérience variée en développement et animé par un réel intérêt pour la pédagogie, il a rédigé cet ouvrage afin de proposer une approche claire et progressive de la maîtrise du langage Go.
