Valeurs par défaut et Zero Values
Fait partie de la section Programmation Orientée Objet du Journey GO de Coddy — leçon 17 sur 107.
En Go, chaque variable a une valeur zéro — la valeur par défaut attribuée lorsque vous déclarez une variable sans initialisation explicite. Comprendre les valeurs zéro est essentiel pour travailler avec les structs, car les champs non initialisés reçoivent automatiquement ces valeurs par défaut.
Chaque type a sa propre valeur zéro :
| Type | Valeur Zéro |
|---|---|
| int, float64 | 0 |
| string | "" (chaîne vide) |
| bool | false |
| pointer, slice, map | nil |
Lorsque vous créez une struct, tout champ que vous ne définissez pas explicitement reçoit sa valeur zéro.
type User struct {
Name string
Age int
Active bool
}
func main() {
var u User
fmt.Println(u.Name) // "" (chaîne vide)
fmt.Println(u.Age) // 0
fmt.Println(u.Active) // false
}Cela s'applique également à l'initialisation partielle. Seuls les champs que vous spécifiez reçoivent des valeurs personnalisées.
u := User{Name: "Alice"}
fmt.Println(u.Age) // 0
fmt.Println(u.Active) // false
Les valeurs par défaut rendent les structs immédiatement utilisables sans initialisation explicite. Cependant, faites attention aux types de référence comme les slices et les maps — leur valeur par défaut est nil, ce qui peut provoquer des panics à l'exécution si vous essayez de les utiliser sans initialisation.
Défi
FacileConstruisons un système de profil de joueur qui démontre le fonctionnement des valeurs par défaut (zero values) en Go. Vous allez créer un profil de jeu où certains champs sont explicitement définis tandis que d'autres reposent sur leurs valeurs par défaut.
Vous organiserez votre code sur deux fichiers :
player.go: Définissez une structurePlayeravec les champs suivants :Username(string),Level(int),Score(int),IsPremium(bool), etGuildName(string). Créez également une méthodeDisplayProfilequi retourne une chaîne formatée affichant toutes les informations du joueur.main.go: Lisez un nom d'utilisateur à partir de l'entrée et créez un Player en utilisant uniquement une initialisation partielle — définissez uniquement le champUsername. Ensuite, affichez le profil complet pour voir comment Go remplit les champs non définis avec leurs valeurs par défaut.
L'entrée suivante sera fournie :
- Ligne 1 : Le nom d'utilisateur du joueur
Votre méthode DisplayProfile doit retourner une chaîne dans ce format exact :
Username: [Username]
Level: [Level]
Score: [Score]
Premium: [IsPremium]
Guild: [GuildName]Par exemple, si le nom d'utilisateur est ShadowKnight, votre sortie doit afficher le nom d'utilisateur ainsi que toutes les valeurs par défaut pour les champs non initialisés :
Username: ShadowKnight
Level: 0
Score: 0
Premium: false
Guild: Remarquez comment le champ Guild n'affiche rien après les deux-points — c'est la valeur par défaut de la chaîne vide. Ce défi vous aide à voir exactement ce que Go assigne à chaque type lorsque vous ne fournissez pas de valeur explicite.
Aide-mémoire
En Go, chaque variable a une valeur zéro — la valeur par défaut attribuée lorsque vous déclarez une variable sans initialisation explicite.
Chaque type a sa propre valeur zéro :
| Type | Valeur zéro |
|---|---|
| int, float64 | 0 |
| string | "" (chaîne vide) |
| bool | false |
| pointer, slice, map | nil |
Lorsque vous créez une structure (struct), tout champ que vous ne définissez pas explicitement reçoit sa valeur zéro :
type User struct {
Name string
Age int
Active bool
}
func main() {
var u User
fmt.Println(u.Name) // "" (chaîne vide)
fmt.Println(u.Age) // 0
fmt.Println(u.Active) // false
}Initialisation partielle — seuls les champs spécifiés reçoivent des valeurs personnalisées :
u := User{Name: "Alice"}
fmt.Println(u.Age) // 0
fmt.Println(u.Active) // falseLes valeurs zéro rendent les structures immédiatement utilisables sans initialisation explicite. Soyez prudent avec les types de référence comme les slices et les maps — leur valeur zéro est nil, ce qui peut provoquer des panics à l'exécution s'ils sont utilisés sans initialisation.
Essayez vous-même
package main
import (
"fmt"
)
func main() {
// Lire le `username` depuis l'entrée
var username string
fmt.Scanln(&username)
// TODO: Créer un `Player` en utilisant une initialisation partielle
// Définir uniquement le champ `Username`, laisser les autres champs utiliser les valeurs par défaut
// TODO: Afficher le profil du joueur en utilisant la méthode `DisplayProfile`
}
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