cybercursus

Les méthodes et les interfaces

15 min · Intermédiaire · 3 octobre 2026

Sommaire
  1. Attacher une méthode à un struct
  2. Récepteur par valeur ou par pointeur
  3. Les interfaces
  4. Utiliser une interface pour du code générique
  5. À toi de jouer

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())
Que produit ce code à l'exécution ?
Qu'est-ce qu'un récepteur, dans la déclaration `func (r Rectangle) Aire() int { ... }` ?
Comment une struct implémente-t-elle une interface en Go, par rapport à Java où il faut écrire explicitement implements NomInterface ?

Pour aller plus loin

Commentaires

Recherche