cybercursus

Les structs

13 min · Intermédiaire · 3 octobre 2026

Sommaire
  1. Définir et utiliser un struct
  2. Struct copié par valeur
  3. Passer un struct par référence avec un pointeur
  4. Les structs imbriqués
  5. À toi de jouer

Définir et utiliser un struct

go
type Personne struct {
  Nom string
  Age int
}

p := Personne{Nom: "Alice", Age: 25}
fmt.Println(p.Nom)  // "Alice"
fmt.Println(p.Age)  // 25

p.Age = 26 // modifie le champ directement
fmt.Println(p.Age)  // 26

Un champ commençant par une majuscule (Nom, Age) est exporté, accessible depuis d’autres packages ; un champ en minuscule resterait privé au package courant, l’équivalent approximatif de private en Java.

Struct copié par valeur

go
p1 := Personne{Nom: "Alice", Age: 25}
p2 := p1 // copie complete et independante

p2.Age = 99
fmt.Println(p1.Age) // 25, inchange
fmt.Println(p2.Age) // 99

Attention

Contrairement aux objets Java ou Python (manipulés par référence), un struct Go est copié par valeur à chaque assignation ou passage en paramètre de fonction. Modifier la copie n’affecte jamais l’original.

Passer un struct par référence avec un pointeur

go
func vieillir(p *Personne) {
  p.Age++ // modifie l'original, via le pointeur
}

personne := Personne{Nom: "Bob", Age: 30}
vieillir(&personne)
fmt.Println(personne.Age) // 31

&personne crée un pointeur vers personne ; la fonction vieillir reçoit ce pointeur (*Personne) et peut ainsi modifier l’original, contournant la copie par valeur par défaut.

Les structs imbriqués

go
type Adresse struct {
  Ville string
}

type Employe struct {
  Nom     string
  Adresse Adresse
}

e := Employe{Nom: "Claire", Adresse: Adresse{Ville: "Lyon"}}
fmt.Println(e.Adresse.Ville) // "Lyon"

À toi de jouer

go
type Rectangle struct {
  Largeur int
  Hauteur int
}

func aire(r Rectangle) int {
  return r.Largeur * r.Hauteur
}

r := Rectangle{Largeur: 4, Hauteur: 5}
fmt.Println(aire(r))
Que produit ce code à l'exécution ?
Go n'ayant pas de classes comme Java ou Python, comment regroupe-t-on des données liées (comme le nom et l'âge d'une personne) dans une même structure ?
Que se passe-t-il quand on assigne une variable de type struct à une autre, comme `p2 := p1` (p1 étant un struct Personne) ?

Pour aller plus loin

Commentaires

Recherche