Go n'a pas de notion de vide, de null ou d'undefined pour la valeur des variables. Les variables déclarées sans valeur initiale explicite prennent par défaut la valeur zéro de leur type respectif.
La valeur zéro des types primitifs, comme les booléens, les types numériques et les strings, est respectivement false, 0 et "".
L'identifiant nil, qui signifie zéro, est la valeur zéro des types plus complexes, comme les pointeurs, les fonctions, les interfaces, les slices, les channels et les maps.
Le tableau suivant détaille la valeur zéro des types de Go.
| Type | Valeur zéro |
|---|---|
| booléen | false |
| numérique | 0 |
| string | "" |
| pointeur | nil |
| fonction | nil |
| interface | nil |
| slice | nil |
| channel | nil |
| map | nil |
Tu as peut-être remarqué que les types structure sont absents du tableau ci-dessus. C'est parce que la valeur zéro d'une structure dépend de ses champs. Une structure est mise à sa valeur zéro lorsque tous ses champs sont mis à leur valeur zéro respective.
Ton travail consiste à préparer le système informatique de la ville pour un prochain recensement. Plus précisément, tu es responsable du programme qui traitera les données des agents recenseurs.
Le programme doit pouvoir créer un nouvel habitant dans le système à partir des informations d'un habitant. De plus, tu vas écrire des fonctions qui vérifient que les informations requises sont bien présentes dans les données d'un habitant, et qui suppriment les données d'un habitant. Enfin, tu compteras les habitants pour fournir un décompte précis du recensement.
Lorsqu'un agent recenseur collecte les informations d'un habitant, il doit enregistrer cet habitant en saisissant son nom, son âge et son adresse dans le système.
Implémente la fonction NewResident qui prend trois arguments :
La fonction doit renvoyer un pointeur vers une structure Resident qui contient ces informations.
name := "Matthew Sanabria"
age := 29
address := map[string]string{"street": "Main St."}
NewResident(name, age, address)
// => &{Matthew Sanabria 29 map[street:Main St.]}
Les habitants peuvent être réticents à fournir des données personnelles aux agents recenseurs. Dans ce cas, il est nécessaire de déterminer si l'habitant a fourni les informations requises pour être compté dans le recensement.
Pour être compté, un habitant doit fournir une valeur non nulle pour son nom et une adresse qui contient une valeur non nulle pour la clé street.
Toutes les autres informations, comme l'âge de l'habitant, sont facultatives.
Implémente la méthode HasRequiredInfo qui renvoie un booléen indiquant si l'habitant a fourni les informations requises.
name := "Matthew Sanabria"
age := 0
address := make(map[string]string)
resident := NewResident(name, age, address)
resident.HasRequiredInfo()
// => false
La vie va vite et les erreurs arrivent. Un habitant peut quitter la ville. Un agent recenseur peut faire des erreurs en collectant les données. Dans ces cas, il est nécessaire de pouvoir supprimer les données d'un habitant afin qu'il ne soit pas compté.
Implémente la méthode Delete qui remet tous les champs de l'habitant à leur valeur nulle.
name := "Matthew Sanabria"
age := 29
address := map[string]string{"street": "Main St."}
resident := NewResident(name, age, address)
fmt.Println(resident)
// Output: &{Matthew Sanabria 29 map[street:Main St.]}
resident.Delete()
fmt.Println(resident)
// Output: &{ 0 map[]}
Maintenant que le système prend en charge les données du recensement, il est temps de réaliser le recensement et de compter les habitants !
Implémente la fonction Count qui prend un argument :
Resident.La fonction doit renvoyer un entier indiquant le nombre d'habitants comptés lors du recensement. Un habitant ne peut être compté que s'il a fourni les informations requises à l'agent recenseur.
name1 := "Matthew Sanabria"
age1 := 29
address1 := map[string]string{"street": "Main St."}
resident1 := NewResident(name1, age1, address1)
name2 := "Rob Pike"
age2 := 0
address2 := make(map[string]string)
resident2 := NewResident(name2, age2, address2)
residents := []*Resident{resident1, resident2}
Count(residents)
// => 1
Inscris-toi sur Exercism pour apprendre et maîtriser Go avec 34 concepts166 exercices, et un vrai mentorat humain, le tout gratuitement.