Les méthodes et les interfaces
15 min · Intermédiaire · 3 octobre 2026
Attacher une méthode à un struct
go
type Rectangle struct {
Largeur int
Hauteur int
}
func (r Rectangle) Aire() int {
return r.Largeur * r.Hauteur
}
rect := Rectangle{Largeur: 4, Hauteur: 5}
fmt.Println(rect.Aire()) // 20 (r Rectangle) avant le nom de la méthode est le récepteur : il attache Aire() au type Rectangle, rendant possible l’appel rect.Aire().
Récepteur par valeur ou par pointeur
go
func (r Rectangle) DoublerParValeur() {
r.Largeur *= 2 // modifie seulement la copie locale
}
func (r *Rectangle) DoublerParPointeur() {
r.Largeur *= 2 // modifie l'original, via le pointeur
}
rect := Rectangle{Largeur: 4, Hauteur: 5}
rect.DoublerParValeur()
fmt.Println(rect.Largeur) // 4, inchange
rect.DoublerParPointeur()
fmt.Println(rect.Largeur) // 8, modifie Attention
Un récepteur par valeur (r Rectangle) reçoit une copie, comme n’importe quel paramètre de fonction. Pour qu’une méthode modifie réellement l’instance d’origine, le récepteur doit être un pointeur (r *Rectangle).
Les interfaces
go
type Animal interface {
Crier() string
}
type Chien struct {
Nom string
}
func (c Chien) Crier() string {
return c.Nom + " aboie !"
}
var a Animal = Chien{Nom: "Rex"} // Chien implemente Animal implicitement
fmt.Println(a.Crier()) // "Rex aboie !" Aucune déclaration implements n’est nécessaire : dès que Chien possède une méthode Crier() string, elle satisfait automatiquement l’interface Animal.
Utiliser une interface pour du code générique
go
type Chat struct {
Nom string
}
func (c Chat) Crier() string {
return c.Nom + " miaule !"
}
animaux := []Animal{Chien{Nom: "Rex"}, Chat{Nom: "Felix"}}
for _, animal := range animaux {
fmt.Println(animal.Crier())
}
// "Rex aboie !"
// "Felix miaule !" À toi de jouer
go
type Forme interface {
Aire() float64
}
type Carre struct {
Cote float64
}
func (c Carre) Aire() float64 {
return c.Cote * c.Cote
}
var f Forme = Carre{Cote: 5}
fmt.Println(f.Aire())