Comprendre et utiliser les interfaces en Go
Qu'est-ce qu'une interface ?
En Go, les interfaces permettent de définir un ensemble de méthodes qu'un type doit implémenter.
Déclaration d'une interface
Listes de méthode(s) obligatoire(s)
Une interface est constituée d’une liste de méthodes que tout type doit implémenter pour être conforme à cette interface.
package main
import "fmt"
// Définition d'une interface
type Speaker interface {
Speak() string
}
type Human struct {
Name string
}
func (h Human) Speak() string {
return "Bonjour, je suis " + h.Name
}
func main() {
var s Speaker
s = Human{Name: "Alice"}
fmt.Println(s.Speak())
}
Explication du code
Lignes 5 à 9 : l'interface Speaker
contient une seule méthode Speak qui doit retourner une chaîne de caractères.
Lignes 11 à 13 : déclaration de la struct
Human
.
Lignes 15 à 17 : Ajout de la méthode Speak
à la struct
Human
. Cette méthode satisfait automatiquement l’interface Speaker.
Ligne 20 à 21 : Déclaration d’une variable s
de type Speaker
et assignation d’une instance de Human
. Go vérifie implicitement que Human implémente Speaker.
Ligne 22 : Appel de la méthode Speak
via l’interface Speaker
.
Que se passe-t-il sans l'interface ?
Un code sans interface !
Voici le code sans l'interface :
package main
import "fmt"
type Human struct {
Name string
}
func (h Human) Speak() string {
return "Bonjour, je suis " + h.Name
}
func main() {
s := Human{Name: "Alice"}
fmt.Println(s.Speak())
}
Le code est parfaitement valide ! 😎
Cependant, si j’oublie d’ajouter la méthode Speak, aucun problème n’apparaît 😬 :
package main
type Human struct {
Name string
}
func main() {
s := Human{Name: "Alice"}
}
Le programme compile sans erreur, même si Speak
est absent. Rien ne force Human
à avoir cette méthode.
L'impact de l'interface
Si on introduit une interface Speaker
et que Human
est censé l’implémenter, alors oublier la méthode Speak
devient une erreur :
package main
// Définition d'une interface
type Speaker interface {
Speak() string
}
type Human struct {
Name string
}
func main() {
var s Speaker
s = Human{Name: "Alice"} // ❌ Erreur de compilation
}
Go affiche alors un message d’erreur :
❌ cannot use Human{…} (value of type Human) as Speaker value in assignment: Human does not implement Speaker (missing method Speak)
Pourquoi utiliser les interfaces ?
On voit ici tout l’intérêt des interfaces : elles imposent une structure et garantissent qu’un type possède bien un comportement attendu.
Les interfaces offrent plusieurs avantages la sécurité du code, en obligeant les types à implémenter certaines méthodes, elles réduisent le risque d’erreur et facilitent la maintenance.
Ainsi, les interfaces ne sont pas juste une contrainte : elles améliorent la robustesse, l’organisation et la maintenabilité du code ! 🚀