Méthodes Getter & Setter
Fait partie de la section Programmation Orientée Objet du Journey GO de Coddy — leçon 49 sur 107.
Comme les champs non exportés ne peuvent pas être accédés directement depuis l'extérieur d'un paquet, vous devez fournir des méthodes permettant un accès contrôlé. Celles-ci sont couramment appelées getters et setters.
En Go, la convention pour les getters est simple : utilisez le nom du champ avec une première lettre en majuscule. N'utilisez pas le préfixe « Get » — utilisez simplement Balance(), et non GetBalance() :
type BankAccount struct {
balance int // non exporté
}
// Getter - retourne la valeur
func (b *BankAccount) Balance() int {
return b.balance
}
// Setter - modifie la valeur avec validation
func (b *BankAccount) SetBalance(amount int) {
if amount >= 0 {
b.balance = amount
}
}
Le véritable pouvoir des setters est d'ajouter de la validation ou de la logique métier. Au lieu de laisser le code externe définir n'importe quelle valeur directement, vous contrôlez ce qui est autorisé :
func (b *BankAccount) Deposit(amount int) bool {
if amount <= 0 {
return false
}
b.balance += amount
return true
}
Cette méthode Deposit agit comme un setter spécialisé qui applique des règles — aucun dépôt négatif n'est autorisé. Le code externe doit passer par vos méthodes, garantissant que la struct reste toujours dans un état valide. C'est l'encapsulation en action : masquer les données tout en exposant un comportement contrôlé.
Défi
FacileConstruisons un convertisseur de température qui démontre une encapsulation appropriée en utilisant des méthodes getter et setter. Vous allez créer une structure qui stocke la température en interne en Celsius mais fournit un accès contrôlé via des méthodes avec validation.
Vous organiserez votre code sur deux fichiers :
temperature.go: Créez une structureTemperatureavec un champcelsiusnon exporté (float64). Implémentez les méthodes suivantes :Celsius()- un getter qui retourne la température actuelle en CelsiusSetCelsius(value float64)- un setter qui n'accepte que des valeurs supérieures ou égales au zéro absolu (-273.15). Si la valeur est inférieure à ce seuil, la température doit rester inchangée.Fahrenheit()- retourne la température convertie en Fahrenheit en utilisant la formule :(celsius * 9/5) + 32SetFahrenheit(value float64)- convertit l'entrée de Fahrenheit en Celsius et la stocke, mais seulement si la valeur Celsius résultante est supérieure ou égale à -273.15
NewTemperature(celsius float64) *Temperaturequi crée une température initialisée à la valeur donnée (supposez une entrée valide pour le constructeur).main.go: Lisez les valeurs de température depuis l'entrée et démontrez les méthodes getter/setter. Créez une température, affichez ses valeurs dans les deux unités, puis tentez de définir de nouvelles valeurs et affichez les résultats.
Les entrées suivantes seront fournies :
- Ligne 1 : Valeur Celsius initiale
- Ligne 2 : Nouvelle valeur Celsius à définir
- Ligne 3 : Nouvelle valeur Fahrenheit à définir
Formatez toutes les sorties de température avec deux décimales. Affichez la séquence suivante :
- Après la création :
C: [celsius] F: [fahrenheit] - Après avoir défini le Celsius :
C: [celsius] F: [fahrenheit] - Après avoir défini le Fahrenheit :
C: [celsius] F: [fahrenheit]
Par exemple, avec 25, -300, et 212, votre sortie devrait être :
C: 25.00 F: 77.00
C: 25.00 F: 77.00
C: 100.00 F: 212.00Notez que la deuxième ligne affiche des valeurs inchangées car -300 est en dessous du zéro absolu, donc le setter l'a rejeté. La troisième ligne affiche la température après avoir défini avec succès 212°F (ce qui se convertit en 100°C). C'est le pouvoir des setters : ils imposent des règles qui maintiennent la validité de vos données.
Aide-mémoire
Les champs non exportés nécessitent des méthodes getter et setter pour un accès contrôlé depuis l'extérieur du paquet.
Convention pour les Getters
En Go, les getters utilisent le nom du champ avec une première lettre majuscule. Ne mettez pas le préfixe « Get » :
type BankAccount struct {
balance int // non exporté
}
// Getter - retourne la valeur
func (b *BankAccount) Balance() int {
return b.balance
}Setter avec validation
Les setters modifient les valeurs et peuvent inclure une validation ou une logique métier :
// Setter - modifie la valeur avec validation
func (b *BankAccount) SetBalance(amount int) {
if amount >= 0 {
b.balance = amount
}
}Setters spécialisés
Créez des méthodes qui appliquent des règles spécifiques au lieu de permettre l'assignation directe de valeurs :
func (b *BankAccount) Deposit(amount int) bool {
if amount <= 0 {
return false
}
b.balance += amount
return true
}Cette approche garantit l'encapsulation : masquer les données tout en exposant un comportement contrôlé, maintenant ainsi les structures dans un état valide.
Essayez vous-même
package main
import (
"fmt"
)
func main() {
// Lire les valeurs d'entrée
var initialCelsius float64
var newCelsius float64
var newFahrenheit float64
fmt.Scanln(&initialCelsius)
fmt.Scanln(&newCelsius)
fmt.Scanln(&newFahrenheit)
// TODO: Créer une nouvelle Temperature en utilisant le constructeur
// TODO: Afficher les valeurs initiales au format "C: [celsius] F: [fahrenheit]" avec 2 décimales
// TODO: Tenter de définir la nouvelle valeur Celsius et afficher le résultat
// TODO: Tenter de définir la nouvelle valeur Fahrenheit et afficher le résultat
}
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
1Fondamentaux de la POO en Go
Fichiers externesEspace de travail et Modules GoPackages et ImportsNoms exportés vs non exportésIntroduction à la POO en GoLes Structs comme ClassesDéfinir des méthodes sur les StructsReceveurs par pointeur vs par valeurInitialisation de StructsFonctions constructeursRécapitulatif - Calculatrice simple4Interfaces
Introduction aux interfacesImplémentation impliciteL'interface comme contratInterface vide (any)Assertion de typeType SwitchComposition d'interfacesInterfaces Stringer & ErrorRécapitulatif - Calculateur de formes7Encapsulation
Champs exportés vs non exportésEncapsulation au niveau du packageMéthodes Getter & SetterMasquage d'informations en GoRécapitulatif - Dossiers étudiants10Génériques (Go 1.18+)
Introduction aux génériquesParamètres de typeContraintes de typeStructures génériquesContournement pour les méthodes génériquesRécapitulatif - Collections génériques13Patrons de conception, Partie 1
Introduction aux Design PatternsPatron SingletonPatron FactoryPatron Abstract FactoryPatron ObserverPatron Strategy2Exploration approfondie des Types et Structs
Types de base et compositesDéfinitions de types personnalisésTags de StructStructs anonymesStructs imbriquéesValeurs par défaut et Zero ValuesRécapitulatif - Carnet de contacts5Composition plutôt qu'héritage
Pourquoi Go n'a pas d'héritageLes bases de l'imbrication de structsPromotion de méthodesImbriquer plusieurs structsImbrication vs AgrégationMasquage de méthodes imbriquéesRécapitulatif - Hiérarchie des employés8Gestion des erreurs & POO
L'interface errorTypes d'erreurs personnalisésError Wrapping (fmt.Errorf)Erreurs sentinelleserrors.Is() et errors.As()Panic, Defer et RecoverRécapitulatif - File Parser11Bibliothèque standard et POO
io.Reader & io.WriterL'interface sort.InterfaceL'interface fmt.Stringerencoding/json avec les StructsL'interface http.HandlerRécapitulatif - Modèles d'API REST14Patrons de conception, Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Template MethodPatron ÉtatPatron CompositeMiddleware en tant que Décorateur3Pointeurs et Mémoire
Bases des pointeurs en GoPointeurs vers des structsPassage par valeur vs référenceLa fonction new()Garbage Collection en GoRécapitulatif - Constructeur de liste chaînée6Le polymorphisme en Go
Le polymorphisme via les interfacesLe Duck Typing en GoRègles de satisfaction des interfacesCollections polymorphesInjection de dépendancesRécapitulatif - Processeur de paiement9Concurrence et POO
Bases des GoroutinesChannels et CommunicationChannels avec buffer vs sans bufferL'instruction Selectsync.Mutex et sync.RWMutexsync.WaitGroupConception de structures Thread-SafeRécapitulatif - Worker Pool