Receveurs par valeur
Fait partie de la section Logique & Flux du Journey GO de Coddy — leçon 7 sur 68.
Lorsque vous définissez une méthode avec un récepteur de valeur (value receiver), la méthode opère sur une copie de l'instance de la struct plutôt que sur l'original. Cela signifie que toute modification apportée au récepteur à l'intérieur de la méthode n'affectera pas la variable struct d'origine.
type Counter struct {
Value int
}
func (c Counter) increment() {
c.Value++ // Ceci modifie la copie, pas l'original
}Dans cet exemple, la méthode increment a un récepteur de valeur (c Counter). Lorsque vous appelez cette méthode sur une instance de Counter, Go crée une copie de la structure et la transmet à la méthode. Toute modification de c.Value à l'intérieur de la méthode n'affecte que cette copie.
Les récepteurs de valeur sont utiles lorsque votre méthode a seulement besoin de lire des données de la struct sans les modifier. Ils sont sûrs à utiliser car ils garantissent que les données originales restent inchangées, ce qui rend votre code plus prévisible et évite les effets secondaires indésirables.
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 à travailler avec des récepteurs de valeur (value receivers) en créant un système simple de surveillance de la température. Vous allez créer une structure Sensor et définir des méthodes qui démontrent comment les récepteurs de valeur fonctionnent avec des copies de la structure.
Vous recevrez trois entrées :
- Une chaîne de caractères représentant l'ID du capteur (par exemple,
"TEMP001") - Une chaîne de caractères représentant le relevé de température actuel (par exemple,
"23.5") - Une chaîne de caractères représentant une valeur d'ajustement de la température (par exemple,
"2.0")
Votre tâche consiste à :
- Définir une structure
Sensoravec deux champs :ID(string) etTemperature(float64) - Créer une méthode appelée
displayReadingavec un récepteur de valeur qui affiche les informations du capteur au format :"Sensor [ID]: [temperature]°C" - Créer une méthode appelée
adjustTemperatureavec un récepteur de valeur qui ajoute la valeur d'ajustement à la température et affiche :"Adjusted reading: [new_temperature]°C" - Analyser les entrées pour créer une instance de
Sensor - Appeler la méthode
displayReadingpour afficher la température d'origine - Appeler la méthode
adjustTemperatureavec la valeur d'ajustement - Appeler à nouveau la méthode
displayReadingpour démontrer que la structure d'origine reste inchangée
Ce défi démontrera que les méthodes avec des récepteurs de valeur travaillent sur des copies de la structure, de sorte que la valeur de température de la structure d'origine restera inchangée même après l'appel de la méthode adjustTemperature. Les valeurs de température doivent être affichées avec une précision d'une décimale.
Aide-mémoire
Les récepteurs de valeur opèrent sur une copie de l'instance de la structure, et non sur l'original. Les modifications apportées à l'intérieur de la méthode n'affectent pas la structure originale.
type Counter struct {
Value int
}
func (c Counter) increment() {
c.Value++ // Cela modifie la copie, pas l'original
}Les récepteurs de valeur sont utiles lorsque les méthodes ont seulement besoin de lire des données sans modifier la structure originale, ce qui rend le code plus prévisible et évite les effets secondaires indésirables.
Essayez vous-même
package main
import (
"fmt"
"strconv"
)
// TODO: Définissez votre structure Sensor ici
// TODO: Définissez votre méthode displayReading avec un récepteur de valeur ici
// TODO: Définissez votre méthode adjustTemperature avec un récepteur de valeur ici
func main() {
// Lire les entrées
var sensorID string
var tempStr string
var adjustStr string
fmt.Scanln(&sensorID)
fmt.Scanln(&tempStr)
fmt.Scanln(&adjustStr)
// Analyser les valeurs de température et d'ajustement
temperature, _ := strconv.ParseFloat(tempStr, 64)
adjustment, _ := strconv.ParseFloat(adjustStr, 64)
// TODO: Créer une instance de Sensor et appeler les méthodes requises
}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