1. Livres & vidéos
  2. Golang
  3. Les bases du langage
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

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