Les structs
13 min · Intermédiaire · 3 octobre 2026
Définir et utiliser un struct
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
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
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
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
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))