Les bases du langage
Types de données fondamentaux : entiers, flottants, booléens, chaînes de caractères
Go est un langage de programmation statiquement typé, ce qui signifie que chaque variable doit être associée à un type spécifique. Cela permet de détecter de nombreuses erreurs lors de la compilation et garantit que les types de données sont utilisés de manière sûre et efficace. Go propose plusieurs types de données fondamentaux qui constituent la base de tout programme. Nous allons aborder les types de données les plus courants : les entiers, les flottants, les booléens et les chaînes de caractères. Chacun de ces types a des propriétés uniques qui les rendent adaptés à des usages spécifiques.
1. Types entiers
Les entiers sont des types de données utilisés pour représenter des nombres entiers (sans partie fractionnaire). En Go, les entiers peuvent être signés ou non signés, ce qui détermine si les nombres peuvent être négatifs ou non.
a. Entiers signés
Les entiers signés peuvent représenter des valeurs à la fois négatives et positives. La taille de l’entier détermine sa capacité à stocker des nombres. En Go, les types d’entiers signés sont les suivants :
-
int8 : un entier signé sur 8 bits. Il peut stocker des valeurs allant de -128 à 127.
-
int16 : un entier signé sur 16 bits. Il peut stocker des valeurs de -32 768 à 32 767.
-
int32 : un entier signé sur 32 bits. Il peut stocker des valeurs de -2 147 483 648 à 2 147 483 647.
-
int64 : un entier signé sur 64 bits. Il peut stocker des valeurs de -9 223 372 036 854 775 808 à 9 223 372 036 854 775 807.
-
int : la taille du type int dépend de l’architecture du système. Sur une machine 32 bits, un int sera sur 32 bits, tandis que sur une machine 64 bits, il sera sur 64 bits.
Exemple d’entiers signés
package main
import "fmt"
func main() {
var i8 int8 = -100
var i16 int16 = 32767
var i32 int32 = -2147483648
var i64 int64 = 9223372036854775807
var i int = 12345 // La taille dépend de l'architecture...Variables, constantes et portée
Avec Go, les variables et les constantes sont des éléments fondamentaux pour gérer les données tout au long de l’exécution d’un programme. La gestion de la portée (scope) des variables permet de contrôler leur accessibilité dans différentes parties du code. Dans cette section, nous allons explorer la déclaration de variables, l’usage des constantes, et la portée des variables dans le contexte d’un programme Go.
1. Déclaration de variables
En Go, la déclaration des variables peut se faire de plusieurs manières. Go utilise un système de typage statique, ce qui signifie que chaque variable doit avoir un type défini lors de sa déclaration. Toutefois, Go offre plusieurs moyens de rendre cette déclaration plus concise ou plus explicite.
a. Déclaration explicite avec un type
La méthode la plus explicite consiste à déclarer une variable en spécifiant son type. Voici un exemple classique :
package main
import "fmt"
func main() {
var age int
var name string
age = 30
name = "Alice"
fmt.Println(name, "age", age, "ans")
}
Sortie :
Alice a 30 ans
Dans cet exemple, nous déclarons deux variables age et name avec leurs types respectifs (int et string). Ensuite, nous les initialisons avec des valeurs spécifiques.
b. Déclaration et initialisation simultanées
Il est possible de déclarer et d’initialiser une variable en une seule ligne. Go permet même de déduire le type de la variable à partir de la valeur initiale, ce qui peut rendre le code plus succinct et plus lisible :
package main
import "fmt"
func main() {
age := 30 // Go déduit que 'age' est de type int
name := "Alice" // Go déduit que 'name' est de type string
fmt.Println(name, "a", age, "ans")
}
Sortie :
Alice a 30 ans
Dans cet exemple, l’opérateur...
Structures de contrôle : boucles (for), conditions (if, switch)
Les structures de contrôle sont des éléments fondamentaux de tout langage de programmation. Elles permettent de définir le flux d’exécution de votre code, en exécutant certaines instructions de manière répétée (boucles) ou en condition de la vérification d’une expression (conditions). Go propose des structures de contrôle claires et puissantes pour gérer ces aspects.
1. La boucle for : l’unique boucle de Go
Go se distingue des autres langages par une approche minimaliste et cohérente de la gestion des boucles. Plutôt que de proposer plusieurs types de boucles (comme while, do...while, etc.), le langage ne dispose que de l’instruction for, conçue pour couvrir tous les scénarios d’itération, des plus simples aux plus complexes. Sa souplesse réside dans sa syntaxe modulaire, qui peut s’adapter à différents styles de programmation selon les besoins.
a. La boucle for structurée : initialisation, condition, post-opération
Cette forme classique de la boucle for est idéale pour un comptage ou une itération à nombre fixe. Elle comprend trois parties, séparées par des points-virgules : l’initialisation d’une variable, une condition de maintien, et une mise à jour post-itérative.
package main
import "fmt"
func main() {
for counter := 1; counter <= 5; counter++ {
fmt.Println("Itération numéro :", counter) // Affiche chaque
valeur de counter
}
fmt.Println("La boucle est terminée.")
}
Dans cet exemple, la variable counter commence à 1 et est incrémentée jusqu’à 5. Chaque cycle correspond à une itération contrôlée.
b. La boucle conditionnelle (équivalent implicite du while)
Il est possible de simplifier la syntaxe en ne conservant qu’une condition. Cette approche est utile lorsqu’on ne connaît pas à l’avance le nombre d’itérations nécessaires.
package main
import "fmt"
func main() { ...Tableaux, slices et maps
En Go, comme dans de nombreux autres langages de programmation, il est essentiel de pouvoir manipuler des collections de données. Go offre trois types de données principaux pour cela : les tableaux (arrays), les slices, et les maps. Bien que les tableaux soient la base, les slices et les maps sont beaucoup plus couramment utilisés en pratique en raison de leur flexibilité.
1. Tableaux (Arrays) : taille fixe et typée
Un tableau constitue une structure de données permettant de stocker une suite d’éléments ayant tous le même type, dans une zone contiguë de la mémoire. La taille d’un tableau est fixée lors de sa déclaration et ne peut plus être modifiée par la suite. Elle fait partie intégrante du type du tableau. Ainsi, un tableau de cinq entiers ([5]int) est fondamentalement différent d’un tableau de six entiers ([6]int).
a. Déclaration et initialisation d’un tableau
package main
import "fmt"
func main() {
// Déclaration d'un tableau de 5 entiers initialisé
automatiquement à zéro
var numbers [5]int
fmt.Println("Tableau numbers (valeurs initiales) :", numbers)
// Affiche : [0 0 0 0 0]
// Création d'un tableau de chaînes de caractères avec
initialisation complète
colors := [3]string{"rouge", "vert", "bleu"}
fmt.Println("Tableau colors :", colors) // Affiche : [rouge
vert bleu]
// Initialisation partielle : seules certaines positions sont
définies
points := [5]int{1: 100, 4: 300}
fmt.Println("Tableau points :", points) // Affiche : [0 100 0 0 300]
// Déduction automatique de la taille en fonction des éléments donnés
animals := [...]string{"chat", "chien", "lapin", "cheval"}
fmt.Println("Tableau animals :", animals, "(taille...Fonctions : syntaxe, paramètres, valeurs de retour
Les fonctions sont des blocs de code autonomes qui effectuent une tâche spécifique. Elles sont essentielles pour organiser le code, le rendre réutilisable et améliorer sa lisibilité. En Go, la syntaxe des fonctions est simple et flexible, permettant de définir des fonctions avec ou sans paramètres, et avec une ou plusieurs valeurs de retour.
1. Syntaxe de base d’une fonction
Les fonctions permettent de structurer et de réutiliser le code de manière efficace. Chaque fonction encapsule une suite d’instructions exécutées lorsqu’on l’appelle. Elle peut recevoir des données en entrée (paramètres) et produire une ou plusieurs valeurs en sortie (valeurs de retour).
Voici une structure générale d’une fonction :
func functionName(param1 type1, param2 type2) (returnType1,
returnType2) {
// Corps de la fonction : instructions exécutées lors de l'appel
// ...
return result1, result2
}
a. Décomposition de la déclaration
Pour mieux comprendre la déclaration d’une fonction en Go, voici la signification des principaux éléments qui la composent :
-
func : indique qu’il s’agit d’une fonction.
-
functionName : doit être un identifiant clair et significatif. Il est recommandé de suivre la convention camelCase.
-
param1 type1, param2 type2 : chaque paramètre est nommé, suivi de son type. Il est possible de regrouper des paramètres ayant le même type.
-
(returnType1, returnType2) : une fonction peut renvoyer plusieurs valeurs. Les types de retour doivent être spécifiés entre parenthèses s’ils sont multiples.
Exemple avec un seul retour
package main
import "fmt"
// Cette fonction calcule le carré d'un entier
func square(number int) int {
result := number * number
return result
}
func main() {
value := 7
fmt.Println("Le carré de", value, "est", square(value))
}
Exemple avec plusieurs...