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.
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Défi
FacileDans 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 à :
- Définir une structure
Accountavec deux champs :Name(string) etBalance(float64) - Créer une méthode appelée
depositavec un récepteur de pointeur qui ajoute le montant donné au solde du compte - Créer une méthode appelée
withdrawavec un récepteur de pointeur qui soustrait le montant donné du solde du compte - Créer une méthode appelée
displayBalanceavec un récepteur de valeur qui affiche les informations du compte au format :"Account: [name], Balance: $[balance]" - Analyser les entrées pour créer une instance de
Account - Appeler
displayBalancepour afficher le solde initial - Appeler
depositavec le montant de la transaction - Appeler
displayBalancepour afficher le solde après le dépôt - Appeler
withdrawavec le montant de la transaction - Appeler
displayBalancepour 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
}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
1Structures de contrôle avancées
Switch avec `fallthrough`Sortir de boucles imbriquéesContinuer une boucle spécifiqueL'instruction `goto`Récapitulatif - Contrôle de boucle avancé4Projet : Liste de tâches simple
Configuration du projetAjouter une tâche2Structures et Méthodes
Définir des méthodes sur des structuresReceveurs par valeurReceveurs par pointeurChoisir les receveursMéthodes vs FonctionsRécapitulatif - Comportement des structures5Les Maps en profondeur
Maps de StructsPointeurs comme valeurs de MapTester les Maps NilComparer des MapsRécapitulatif - Compteur de fréquence de mots3Interfaces (Les bases)
Qu'est-ce qu'une Interface ?Définir une InterfaceImplémenter une InterfaceUtiliser les types d'InterfaceInterface videAssertions de typeType SwitchRécapitulatif - Formes et comportements