Une méthode est une fonction avec un argument récepteur spécial.
Le récepteur apparaît dans sa propre liste d'arguments, entre le mot-clé func et le nom de la méthode.
func (receiver type) MethodName(parameters) (returnTypes) {
}
On ne peut définir une méthode qu'avec un récepteur dont le type est défini dans le même package que la méthode.
type Person struct {
Name string
}
func (p Person) Greetings() string {
return fmt.Sprintf("Welcome %s!", p.Name)
}
s := Person{Name: "Bronson"}
fmt.Println(s.Greetings())
// Output: Welcome Bronson!
Il existe deux types de récepteurs : les récepteurs de valeur et les récepteurs pointeur.
Les méthodes dotées d'un récepteur de valeur travaillent sur une copie de la valeur qui leur est passée, ce qui signifie que toute modification apportée au récepteur à l'intérieur de la méthode n'est pas visible pour l'appelant.
Tu peux déclarer des méthodes avec des récepteurs pointeur afin de modifier la valeur vers laquelle pointe le récepteur. Ces modifications sont visibles elles aussi pour l'appelant de la méthode.
type rect struct {
width, height int
}
func (r *rect) squareIt() {
r.height = r.width
}
r := rect{width: 10, height: 20}
fmt.Printf("Width: %d, Height: %d\n", r.width, r.height)
// Output: Width: 10, Height: 20
r.squareIt()
fmt.Printf("Width: %d, Height: %d\n", r.width, r.height)
// Output: Width: 10, Height: 10
Tu trouveras plusieurs exemples ici. Jette aussi un œil à ce court tutoriel sur les méthodes.
Rappel : une méthode n'est qu'une fonction avec un argument récepteur.