Menu
Coddy logo textTech

Receveurs par pointeur

Fait partie de la section Logique & Flux du Journey GO de Coddy — leçon 8 sur 68.

Alors que les receveurs de valeur travaillent avec des copies de structs, les receveurs de pointeur travaillent directement avec l'instance originale de la struct. Lorsque vous définissez une méthode avec un receveur de pointeur, la méthode peut modifier les données originales car elle reçoit un pointeur vers la struct plutôt qu'une copie.

Pour créer un récepteur de pointeur, vous ajoutez un astérisque * avant le nom du type dans la déclaration du récepteur :

type Person struct {
    Name string
    Age  int
}

func (p *Person) haveBirthday() {
    p.Age++  // Cela modifie la structure originale
}

Dans cet exemple, (p *Person) est un récepteur de pointeur. Lorsque vous appelez la méthode haveBirthday sur une instance de Person, la méthode reçoit un pointeur vers la structure originale. Toute modification apportée aux champs de la structure via ce pointeur modifiera de manière permanente les données originales.

Les récepteurs de pointeurs sont essentiels lorsque vos méthodes doivent mettre à jour les champs de la structure, ce qui les rend parfaits pour les opérations qui modifient l'état de vos données.

quiz iconTestez-vous

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

quiz iconTestez-vous

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

quiz iconTestez-vous

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

challenge icon

Défi

Facile

Dans ce défi, vous allez vous entraîner à créer des méthodes avec des récepteurs de pointeurs en construisant un système de compte bancaire simple. Vous créerez une structure Account et définirez des méthodes capables de modifier le solde du compte à l'aide de récepteurs de pointeurs.

Vous recevrez trois entrées :

  • Une chaîne de caractères représentant le nom du titulaire du compte (par exemple, "John Smith")
  • Une chaîne de caractères représentant le solde initial du compte (par exemple, "1000.50")
  • Une chaîne de caractères représentant le montant d'une transaction (par exemple, "250.75")

Votre tâche consiste à :

  1. Définir une structure Account avec deux champs : Name (string) et Balance (float64)
  2. Créer une méthode appelée deposit avec un récepteur de pointeur qui ajoute le montant donné au solde du compte
  3. Créer une méthode appelée withdraw avec un récepteur de pointeur qui soustrait le montant donné du solde du compte
  4. Créer une méthode appelée displayBalance avec un récepteur de valeur qui affiche les informations du compte au format : "Account: [name], Balance: $[balance]"
  5. Analyser les entrées pour créer une instance de Account
  6. Appeler displayBalance pour afficher le solde initial
  7. Appeler deposit avec le montant de la transaction
  8. Appeler displayBalance pour afficher le solde après le dépôt
  9. Appeler withdraw avec le montant de la transaction
  10. Appeler displayBalance pour afficher le solde final

Le solde doit être affiché avec une précision de deux décimales. Ce défi démontre comment les récepteurs de pointeurs permettent aux méthodes de modifier les données de la structure originale, contrairement aux récepteurs de valeurs qui travaillent avec des copies.

Aide-mémoire

Les récepteurs de pointeurs travaillent directement avec l'instance originale de la struct en recevant un pointeur vers la struct plutôt qu'une copie. Cela permet aux méthodes de modifier les données originales.

Pour créer un récepteur de pointeur, ajoutez un astérisque * avant le nom du type dans la déclaration du récepteur :

type Person struct {
    Name string
    Age  int
}

func (p *Person) haveBirthday() {
    p.Age++  // This modifies the original struct
}

Utilisez des récepteurs de pointeurs lorsque vos méthodes doivent mettre à jour les champs de la struct, ce qui les rend parfaits pour les opérations qui modifient l'état de vos données.

Essayez vous-même

package main

import (
	"fmt"
	"strconv"
)

// TODO: Définir la structure Account ici

// TODO: Définir la méthode deposit avec un récepteur de pointeur ici

// TODO: Définir la méthode withdraw avec un récepteur de pointeur ici

// TODO: Définir la méthode displayBalance avec un récepteur de valeur ici

func main() {
	// Lire l'entrée
	var name string
	var initialBalanceStr string
	var transactionAmountStr string
	
	fmt.Scanln(&name)
	fmt.Scanln(&initialBalanceStr)
	fmt.Scanln(&transactionAmountStr)
	
	// Convertir les entrées de type chaîne vers les types appropriés
	initialBalance, _ := strconv.ParseFloat(initialBalanceStr, 64)
	transactionAmount, _ := strconv.ParseFloat(transactionAmountStr, 64)
	
	// TODO: Créer une instance de Account
	
	// TODO: Afficher le solde initial, effectuer un dépôt, afficher le solde, effectuer un retrait, afficher le solde final
}
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 Logique & Flux