Menu
Coddy logo textTech

Receveurs par pointeur vs par valeur

Fait partie de la section Programmation Orientée Objet du Journey GO de Coddy — leçon 8 sur 107.

Les méthodes peuvent avoir soit un récepteur de valeur, soit un récepteur de pointeur. Un récepteur de valeur travaille sur une copie de la struct. Un récepteur de pointeur travaille sur la struct originale et peut modifier ses champs.

Récepteur de valeur — travaille sur une copie

type Counter struct {
    Count int
}

func (c Counter) GetCount() int {
    return c.Count
}

// Ceci ne modifie PAS l'original
func (c Counter) IncrementWrong() {
    c.Count++ // Modifie seulement la copie !
}

Récepteur de pointeur — modifie l'original

// Ceci MODIFIE l'original
func (c *Counter) Increment() {
    c.Count++
}

func (c *Counter) Reset() {
    c.Count = 0
}

Utilisation des deux ensemble

func main() {
    counter := Counter{Count: 0}

    counter.Increment()
    counter.Increment()
    fmt.Println(counter.GetCount()) // Sortie : 2

    counter.Reset()
    fmt.Println(counter.GetCount()) // Sortie : 0
}

Utilisez un récepteur de valeur lorsque la méthode lit uniquement des données. Utilisez un récepteur de pointeur (*StructName) lorsque la méthode doit modifier les champs de la structure. Go gère automatiquement le référencement — vous appelez les deux de la même manière.

challenge icon

Défi

Moyen

Ajoutez des méthodes à la structure Wallet en utilisant les types de récepteurs corrects :

  • GetBalance — récepteur de valeur, retourne le solde actuel
  • Deposit — récepteur de pointeur, ajoute le montant au solde
  • Withdraw — récepteur de pointeur, soustrait le montant uniquement s'il y a des fonds suffisants

Aide-mémoire

Les méthodes peuvent avoir soit un récepteur de valeur, soit un récepteur de pointeur. Un récepteur de valeur travaille sur une copie de la structure. Un récepteur de pointeur travaille sur la structure originale et peut modifier ses champs.

Récepteur de valeur — travaille sur une copie :

type Counter struct {
    Count int
}

func (c Counter) GetCount() int {
    return c.Count
}

Récepteur de pointeur — modifie l'original :

func (c *Counter) Increment() {
    c.Count++
}

Utilisez un récepteur de valeur lorsque la méthode ne fait que lire des données. Utilisez un récepteur de pointeur (*StructName) lorsque la méthode doit modifier les champs de la structure.

Essayez vous-même

package main

import "fmt"

func main() {
    var balance, deposit, withdraw float64
    fmt.Scan(&balance, &deposit, &withdraw)

    w := Wallet{Balance: balance}

    fmt.Printf("Balance: %.2f\n", w.GetBalance())

    w.Deposit(deposit)
    fmt.Printf("After deposit: %.2f\n", w.GetBalance())

    w.Withdraw(withdraw)
    fmt.Printf("After withdrawal: %.2f\n", w.GetBalance())

    fmt.Printf("Final balance: %.2f\n", w.GetBalance())
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation Orientée Objet