Menu
Coddy logo textTech

Récepteurs pointeurs ou 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 agit sur une copie de la structure. Un récepteur de pointeur agit sur la structure d’origine et peut modifier ses champs.

Récepteur de valeur : fonctionne 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++ // Change uniquement la copie !
}

Récepteur pointeur : modifie l’original

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

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

Utiliser les 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 par valeur lorsque la méthode ne fait que lire des données. Utilisez un récepteur par pointeur (*StructName) lorsque la méthode doit modifier les champs de la structure. Go gère automatiquement la référence. 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écepteur appropriés :

  • GetBalance : récepteur par valeur, renvoie le solde actuel
  • Deposit : récepteur par pointeur, ajoute le montant au solde
  • Withdraw : récepteur par pointeur, soustrait le montant uniquement si les fonds sont suffisants

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

Entraînez-vous par vous-même : Compilateur Go en ligne