Hostinger

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 ! 🚀