Apprendre le GO
Mise à jour :
Go, aussi appelé Golang, est devenu une alternative de choix à des langages comme Python, notamment lorsqu’il s’agit des programmes complexes. Pourquoi ? Go combine simplicité et performances grâce à son design minimaliste et sa compilation directe en binaire. Là où Python brille par sa flexibilité, Go excelle par sa rapidité d’exécution et sa capacité à gérer efficacement la concurrence. Si vous avez déjà ressenti des lenteurs avec Python ou affronté ses subtilités dans des environnements distribués, Go pourrait bien devenir votre nouvel allié.
Dans ce guide, on va apprendre les bases pour que vous puissiez écrire vos premiers scripts Go en un rien de temps.
Un peu d’Histoire
Le langage Go a été conçu pour répondre aux besoins de Google en matière de développement de systèmes et de logiciels à grande échelle. Sa création remonte à 2007, sous l’impulsion de trois ingénieurs de renom, Robert Griesemer, Rob Pike et Ken Thompson, tous salariés chez Google. Leur objectif principal était de surmonter les défis posés par les langages existants en termes de performance, d’évolutivité et de facilité de maintenance.
Lors de sa conception, les créateurs de Go ont mis un point d’honneur à souligner la simplicité et l’efficacité en s’inspirant des atouts des langages C et C++, tout en intégrant des avancées innovantes pour la gestion de la concurrence et en corrigeant certains de leurs inconvénients. En novembre 2009, Go a été dévoilé au public comme un projet open source, permettant à des développeurs du monde entier de contribuer à son évolution, de tester ses capacités et de proposer des améliorations précieuses. La version 1.0 de Go a Go a été dévoilé au public comme un projet open source, permettant à des l’introduction d’une API stable. Depuis ce lancement, le langage a connu une évolution constante avec des mises à jour régulières, tout en garantissant la compatibilité en arrière. Au fil du temps, Go a gagné en popularité, notamment auprès des grandes entreprises technologiques. Sa capacité à gérer aisément des processus concurrentiels tout en offrant des performances exceptionnelles a séduit de nombreux développeurs et architectes logiciels.
Au fil du temps, Go a gagné en popularité, notamment dynamique qui enrichit continuellement le langage avec des bibliothèques, des outils et des frameworks, facilitant ainsi son adoption et son utilisation dans une variété de projets. écosystème solide s’est construit autour de Go, porté par une communauté dynamique qui enrichit continuellement le langage avec des bibliothèques, des outils et des frameworks, facilitant ainsi son adoption et son utilisation dans
Installation de Go : Étapes simples et rapides
-
Téléchargez l’installateur ou l’archive Rendez-vous sur la page officielle de téléchargement de Go ↗ et choisissez la version correspondant à votre système d’exploitation.
-
Installez Go sur votre système
- Windows : Téléchargez le fichier
.msi
, exécutez-le, et suivez les étapes de l’assistant d’installation. L’installateur configure automatiquement le chemin d’accèsC:\Go\bin
. - Linux/macOS : Téléchargez l’archive
.tar.gz
, puis exécutez les commandes suivantes dans le terminal :
- Windows : Téléchargez le fichier
(Remplacez go1.xx.x.linux-amd64.tar.gz
par le nom du fichier téléchargé.)
- Les variables d’environnement importantes
Pour que Go fonctionne correctement, il est essentiel de configurer certaines variables d’environnement. Voici les plus importantes :
-
GOPATH
: Indique le répertoire où sont stockés vos projets et dépendances. Par défaut, il est défini dans votre répertoire utilisateur ($HOME/go
sur Linux/macOS ou%USERPROFILE%\go
sur Windows). Si vous souhaitez personnaliser ce chemin, ajoutez dans votre fichier de configuration shell (~/.bashrc
,~/.zshrc
, ou autre) : -
GOROOT
: Indique où Go est installé. En général, vous n’avez pas besoin de modifier cette variable, car elle est automatiquement définie après l’installation. Par exemple, sur Linux/macOS, elle est définie à/usr/local/go
. -
PATH
: Ajoutez le chemin du dossier contenant les binaires de Go pour pouvoir utiliser les commandes commego build
ougo run
. Par exemple :
Votre première application Go
Maintenant que vous avez installé Go, vous pouvez créer votre première application Go.
Pour créer un projet Go, vous devez créer un répertoire dans lequel vous
stockerez vos fichiers de code. Par exemple, si vous souhaitez créer un projet
nommé my-first-go-project
, vous pouvez créer un répertoire nommé
my-first-go-project
dans votre répertoire utilisateur.
Créer un fichier Go
Vous pouvez créer un fichier Go en utilisant n’importe quel éditeur de texte.
Par exemple, si vous utilisez Visual Studio Code, vous pouvez créer un
fichier nommé main.go
dans le répertoire my-first-go-project
.
Dans votre fichier main.go
, ajoutez le code suivant :
Tout commence par une déclaration de package. En Go, chaque fichier appartient à
un package, une sorte de regroupement logique du code. Si votre programme
doit s’exécuter (et non juste fournir une bibliothèque), il doit
obligatoirement appartenir au package main
. C’est ici que tout démarre.
Ajouter des fonctionnalités avec les imports
Vous avez le squelette (main
), mais il faut lui donner du muscle. C’est là
qu’interviennent les packages. Go possède une bibliothèque standard robuste
qui vous évite de réinventer la roue. Par exemple, si vous voulez afficher un
message dans le terminal, vous importez le package fmt
:
Imaginez un instant que vous deviez écrire vous-même un module d’affichage. En Go, pas besoin : tout est prêt à l’emploi.
Et si votre programme a besoin de plusieurs fonctionnalités ? Pas de souci, regroupez vos imports dans un bloc :
Cela rend le tout plus propre, et Go adore la propreté. Après tout, l’ordre des choses, c’est la base, non ?
La fonction main
est le point d’entrée de tout programme Go. Imaginez-la
comme la porte d’entrée d’une maison : sans elle, impossible de visiter
l’intérieur. Voici un exemple simple :
Ce bout de code fait une seule chose : afficher “Hello, Go!” dans le terminal. C’est minimaliste, mais incroyablement puissant. Pourquoi ? Parce que tout, absolument tout, part de cette fonction.
Et si on complexifie un peu ? Supposons que vous voulez demander le nom de l’utilisateur et afficher un message personnalisé. Avec Go, c’est tout aussi simple :
Là, on commence à voir la magie de Go : un code clair, lisible, mais qui fait exactement ce qu’on attend de lui. Et tout ça dans le package main.
Organiser un programme plus complexe
Au fur et à mesure que votre code grandit, il devient essentiel de l’organiser en plusieurs fichiers ou packages. Imaginez un programme qui aurait tout dans un seul fichier… ce serait comme essayer de ranger toute une maison dans une seule pièce.
Voici un exemple d’organisation typique :
-
Dossier du projet :
Dans main.go, vous écrivez le code principal :
Et dans utils/helper.go, vous placez une fonction utilitaire :
Avec cette structure, votre code est propre, modulaire et facile à maintenir.
Les types de données
Go est un langage de programmation qui repose sur un système de typage statique. Cela signifie que chaque variable doit avoir un type défini lors de sa déclaration, et une fois que le type est attribué, il ne peut pas être modifié.
Ce principe assure une conformité stricte lors de l’exécution, réduisant ainsi les erreurs potentielles liées à l’utilisation incorrecte des variables. En conséquence, les développeurs peuvent écrire du code plus sécurisé et fiable, tout en bénéficiant d’optimisations de performance offertes par cette vérification anticipée des types.
Les types simples
Tout commence avec les types simples, la base de tout programme. Ces types permettent de manipuler des nombres, du texte ou des booléens. Mais Go, fidèle à sa philosophie, ne laisse rien au hasard.
Les nombres entiers
Go propose différentes tailles pour les entiers afin de répondre à des besoins spécifiques :
int
: La taille dépend de votre architecture (32 ou 64 bits).int8
,int16
,int32
,int64
: Des tailles fixes.
Exemple :
Ce code illustre comment déclarer et attribuer des valeurs à des variables de type int en Go. On utilise ici deux méthodes :
- la déclaration explicite avec le mot-clé ‘var’ où le type est spécifié
- et la déclaration courte avec ’:=’ qui infère le type de la valeur assignée.
Les nombres à virgule flottante
Idéal pour les calculs nécessitant des décimales. Go propose deux tailles :
float32
float64
(ce dernier étant plus précis).
Exemple :
Les booléens
Les booléens sont simples et directs : true
ou false
. Ils sont souvent
utilisés dans les conditions.
Exemple :
Les chaînes de caractères (string
)
Les chaînes de caractères sont des types de données très utiles. Elles sont utilisées pour représenter du texte, des noms de fichiers, des adresses, des adresses IP, etc.
Exemple :
Les types composites
Pour gérer des collections ou modéliser des entités complexes, Go propose des types composites, chacun conçu pour un usage spécifique.
Les tableaux (array
)
Taille fixe, parfait pour des données dont la taille est connue à l’avance.
Exemple :
Les slices
Une version plus flexible des tableaux, capable de croître ou rétrécir dynamiquement. C’est l’un des types les plus utilisés en Go.
Exemple :
Les maps
Go offre une structure clé-valeur appelée map
, idéale pour organiser des
données par association.
Exemple :
Les structures (struct
)
Permettent de regrouper plusieurs types dans une entité personnalisée, idéale pour modéliser des objets réels.
Exemple :
Conversions et compatibilités entre types
Go impose une conversion explicite entre les types, garantissant ainsi un contrôle strict sur les transformations de données. Cette approche réduit les erreurs potentielles en assurant que chaque conversion est intentionnelle et vérifiée par le programmeur.
Conversion d’un entier en nombre flottant
Pour passer d’un type entier (int
) à un type flottant (float64
), vous devez
explicitement convertir le type :
Autre exemple :
Ces conversions évitent les erreurs subtiles et rendent le comportement du code plus prévisible.
Les opérateurs en Go
Les opérateurs en Go sont conçus pour être simples et intuitifs. Leur utilisation directe et claire s’inscrit dans l’esprit du langage, qui privilégie la lisibilité et la robustesse. Que ce soit pour des calculs simples, des comparaisons ou des manipulations avancées, ils couvrent une large gamme de besoins tout en restant faciles à comprendre et à maîtriser.
Les opérateurs arithmétiques
Ces opérateurs permettent d’effectuer des calculs mathématiques de base.
Opérateur | Description | Exemple |
---|---|---|
+ | Addition | x + y |
- | Soustraction | x - y |
* | Multiplication | x * y |
/ | Division | x / y |
% | Modulo (reste de division) | x % y |
Exemple :
👉 Attention : Les opérateurs comme /
fonctionnent en division entière si
les variables sont des entiers (int
). Pour une division décimale, utilisez des
types float64
.
Les opérateurs relationnels
Les opérateurs relationnels permettent de comparer deux valeurs. Ils retournent
toujours un résultat de type bool
(true
ou false
).
Opérateur | Description | Exemple |
---|---|---|
== | Égal à | x == y |
!= | Différent de | x != y |
< | Inférieur à | x < y |
<= | Inférieur ou égal à | x <= y |
> | Supérieur à | x > y |
>= | Supérieur ou égal à | x >= y |
Exemple :
Les opérateurs logiques
Les opérateurs logiques sont utilisés pour combiner ou inverser des expressions conditionnelles.
Opérateur | Description | Exemple |
---|---|---|
&& | ET logique | x > 0 && y > 0 |
|| | OU logique | x > 0 || y > 0 |
! | NON logique (inversion) | !true |
Exemple :
Les opérateurs d’affectation
Les opérateurs d’affectation servent à attribuer ou modifier la valeur d’une variable.
Opérateur | Description | Exemple |
---|---|---|
= | Affectation | x = y |
+= | Ajout et affectation | x += y |
-= | Soustraction et affectation | x -= y |
*= | Multiplication et affectation | x *= y |
/= | Division et affectation | x /= y |
%= | Modulo et affectation | x %= y |
Exemple :
Les opérateurs sur les bits
Les opérateurs bit-à-bit permettent de manipuler directement les bits des nombres. Ces opérateurs sont souvent utilisés dans des cas spécifiques, comme le traitement des données binaires.
Opérateur | Description | Exemple |
---|---|---|
& | ET bit-à-bit | x & y |
| | OU bit-à-bit | x | y |
^ | OU exclusif (XOR) | x ^ y |
&^ | AND NOT (effacement de bits) | x &^ y |
<< | Décalage à gauche | x << 1 |
>> | Décalage à droite | x >> 1 |
Exemple :
Exercice pratique : Calcul simple avec des opérateurs
Écrivons un petit programme qui utilise plusieurs opérateurs pour effectuer des calculs simples basés sur des entrées utilisateur.
Les structures de contrôle en Go
Les structures de contrôle en Go permettent de gérer le flux d’exécution de votre programme en fonction de conditions ou d’itérations. Simples mais puissantes, elles s’intègrent parfaitement dans la philosophie minimaliste et efficace du langage. Voici une introduction pratique pour comprendre et maîtriser ces structures essentielles.
Les conditions : if
, else if
, et else
Go utilise des conditions pour exécuter du code en fonction de critères. La syntaxe est similaire à celle d’autres langages, mais sans parenthèses autour de la condition (même si elles sont autorisées).
Exemple simple :
Avec plusieurs cas :
Les alternatives conditionnelles : switch
Le switch
en Go est une alternative élégante aux chaînes de if-else
complexe. Il est simple à utiliser et puissant grâce à des fonctionnalités
avancées.
-
Exemple de base :
-
Switch sans expression : Lorsque vous omettez l’expression du
switch
, chaquecase
agit comme une condition indépendante :
👉 Contrairement à d’autres langages, les blocs case
n’ont pas besoin de
break
: l’exécution s’arrête automatiquement après chaque bloc.
Les boucles : for
Go simplifie la gestion des boucles avec une unique structure, la boucle for
.
Elle peut remplacer des constructions comme while
ou do-while
présentes dans
d’autres langages.
-
Boucle classique :
-
Boucle
while
simulée : En Go, une bouclefor
sans initialisation ni incrémentation agit comme unwhile
. -
Boucle infinie : Une boucle infinie est déclarée avec un
for
sans condition.
Contrôler le flux dans les boucles : break
, continue
et goto
Go offre des mots-clés pour manipuler le comportement des boucles.
-
Sortir d’une boucle :
break
-
Passer à l’itération suivante :
continue
-
Sauter à un label :
goto
goto est à utilisé dans les cas où il est impossible d’utiliser break
ou
continue
.
Exercice
Voici la version en Go du jeu de devinette, adaptée pour respecter la logique de Go tout en reprenant l’exercice Python. Go est parfait pour ce type d’exercice grâce à sa simplicité et sa performance.
L’objectif de ce programme est de créer un jeu de devinette où l’utilisateur tente de trouver un nombre mystère choisi à l’avance par le programme. Le but est de maîtriser les bases de Go, comme les boucles, les conditions, et l’interaction utilisateur.
Ce que doit contenir le programme :
- Un nombre à deviner : Un nombre fixe (par exemple, 42) que l’utilisateur doit deviner.
- Des messages d’accueil : Des instructions pour expliquer à l’utilisateur comment jouer.
- Un compteur d’essais : Une variable qui compte les tentatives.
- Une boucle de jeu : Une boucle qui continue jusqu’à ce que le nombre mystère soit trouvé.
- Des comparaisons : Des indices (plus grand ou plus petit) pour guider l’utilisateur.
- Un message de victoire : Un message pour féliciter l’utilisateur avec le nombre d’essais utilisés.
Pour commencer, ouvrez votre éditeur Go préféré (comme Visual Studio Code).
Créez un fichier main.go
et suivez ces étapes :
En-tête et déclaration du nombre mystère
Ajoutez des commentaires pour décrire le programme, puis définissez le nombre mystère.
Messages d’accueil
Affichez des instructions claires pour l’utilisateur.
Initialisation des variables
Ajoutez un compteur d’essais et une variable pour contrôler la boucle.
Boucle principale du jeu
Créez une boucle for
pour répéter le jeu jusqu’à ce que l’utilisateur trouve
le bon nombre.
Exécution du programme
Enregistrez votre fichier en tant que main.go
, puis exécutez-le dans votre
terminal avec cette commande :
Résultat attendu
Le programme affiche des messages clairs pour guider l’utilisateur jusqu’à ce qu’il trouve le nombre mystère. Par exemple :
Améliorations possibles
- Rendre le nombre mystère aléatoire : Utilisez
rand.Intn(100)
pour générer un nombre aléatoire. - Ajouter la gestion des erreurs : Vérifiez si l’utilisateur entre une
valeur valide avec
strconv.Atoi
. - Permettre de rejouer : Ajoutez une boucle pour relancer une partie après avoir gagné.
Avec cette version, vous avez un jeu de devinette en Go qui reprend les bases de la programmation GO tout en exploitant la puissance et la simplicité de ce langage. 😊
Conclusion
Vous avez maintenant appris les bases de Go, et vous êtes prêt à développer vos premières applications avec Go. Dans les prochaines semaines, j’aborderai d’autres sujets comme :
- Les fonctions
- Les structures
- Les interfaces
- Les tests
- Les goroutines
- Les channels
- Les packages
- Les dépendances
- Les dépôts
Plus d’infos
- Site officiel : Go.dev ↗