Aller au contenu

Méthodes et interfaces#

Méthodes sur les types#

  • En Go, les méthodes peuvent être définies pour tout type défini par l'utilisateur, pas seulement pour les structures.
    • Exemple : type MyInt int
    • Déclaration de méthode : func (mi MyInt) Double() int { return int(mi * 2) }
  • Les méthodes sont déclarées avec une réception spéciale qui contient une instance du type.
  • Ces méthodes peuvent ensuite être appelées sur des instances de ce type.
    • Exemple : var x MyInt = 5; fmt.Println(x.Double()) // Affiche 10

Interfaces : définition et utilisation#

  • Une interface est une collection de méthodes.
    • Exemple : type Geometry interface { Area() float64; Perimeter() float64 }
  • Les types qui définissent toutes les méthodes de l'interface satisfont automatiquement l'interface, sans avoir besoin de déclarer explicitement qu'ils la mettent en œuvre.
  • Les interfaces permettent de créer du code généralisé qui peut fonctionner avec plusieurs types différents.
    • Exemple : Une fonction Measure(g Geometry) peut calculer l'aire et le périmètre de toute géométrie, que ce soit un cercle, un rectangle, etc.

Composition d'interfaces#

  • Les interfaces peuvent être composées d'autres interfaces, ce qui signifie qu'une interface peut contenir toutes les méthodes d'une ou de plusieurs autres interfaces.
    • Exemple : type ReadWrite interface { Reader; Writer }
  • Cette caractéristique offre une grande flexibilité pour créer des interfaces complexes tout en maintenant la simplicité et la lisibilité.

Méthodes avec des pointeurs et des récepteurs de valeur#

  • Les méthodes en Go peuvent être déclarées soit avec un récepteur de valeur, soit avec un récepteur de pointeur.
  • Les récepteurs de valeur reçoivent une copie de la valeur, tandis que les récepteurs de pointeur reçoivent une référence à la valeur.
    • Exemple : func (v Value) ChangeVal() { v.x = 5 } // ne modifie pas la valeur originale
    • Exemple : func (p *Pointer) ChangePtr() { p.x = 5 } // modifie la valeur originale
  • Utiliser un récepteur de pointeur lorsque vous devez modifier l'état de l'objet ou si l'objet lui-même est volumineux et coûteux à copier.

Interfaces vides et assertions de type#

  • L'interface vide interface{} peut contenir n'importe quel type, ce qui la rend utile pour le stockage général.
  • L'assertion de type est utilisée pour extraire la valeur sous-jacente de l'interface.
    • Exemple : var i interface{} = "hello"; s := i.(string); fmt.Println(s) // Affiche "hello"
  • Si l'assertion de type échoue, elle renvoie une erreur. Pour éviter cela, vous pouvez utiliser une assertion de type avec une vérification d'erreur.
    • Exemple : s, ok := i.(string); if ok { fmt.Println(s) } else { fmt.Println("Not a string") }