Track
/
Go
Go
/
Esercizi
/
Censimento
Censimento

Censimento

Esercizio di apprendimento

Introduzione

Go non ha un concetto di vuoto, null o undefined per i valori delle variabili. Le variabili dichiarate senza un valore iniziale esplicito assumono il valore zero del proprio tipo.

Il valore zero dei tipi primitivi, come i booleani, i tipi numerici e le stringhe, è rispettivamente false, 0 e "".

L'identificatore nil, che significa zero, è il valore zero per i tipi più complessi, come puntatori, funzioni, interfacce, slice, canali e mappe.

La tabella seguente riporta il valore zero per i tipi di Go.

Tipo Valore zero
booleano false
numerico 0
stringa ""
puntatore nil
funzione nil
interfaccia nil
slice nil
canale nil
mappa nil

Forse avrai notato che i tipi struct non compaiono nella tabella qui sopra. Il motivo è che il valore zero di un tipo struct dipende dai suoi campi. Uno struct viene impostato al suo valore zero quando tutti i suoi campi sono impostati al rispettivo valore zero.

Istruzioni

Il tuo compito è preparare il sistema informatico della città per un prossimo censimento. In particolare, sarai responsabile del programma che elaborerà i dati degli operatori del censimento.

Il programma deve poter creare un nuovo residente nel sistema quando riceve le informazioni di un residente. Inoltre, creerai funzioni che garantiscono che le informazioni richieste siano presenti nei dati del residente ed eliminerai i dati di un residente. Infine, conterai i residenti per fornire un conteggio accurato del censimento.

1. Crea un nuovo residente

Quando un operatore del censimento raccoglie le informazioni di un residente, deve registrare quel residente inserendo nome, età e indirizzo nel sistema.

Implementa la funzione NewResident che accetta tre argomenti:

  • Il nome del residente.
  • L'età del residente.
  • L'indirizzo del residente.

La funzione deve restituire un puntatore a una struct Resident che contiene queste informazioni.

name := "Matthew Sanabria"
age := 29
address := map[string]string{"street": "Main St."}

NewResident(name, age, address)
// => &{Matthew Sanabria 29 map[street:Main St.]}

2. Convalida le informazioni richieste

I residenti potrebbero essere restii a fornire dati personali agli operatori del censimento. In questi casi è necessario determinare se il residente ha fornito le informazioni richieste per essere conteggiato nel censimento.

Per essere conteggiato, un residente deve fornire un valore diverso dal valore zero per il nome e un indirizzo che contenga un valore diverso dal valore zero per la chiave street. Tutte le altre informazioni, come l'età del residente, sono facoltative. Implementa il metodo HasRequiredInfo che restituisce un valore booleano che indica se il residente ha fornito le informazioni richieste.

name := "Matthew Sanabria"
age := 0
address := make(map[string]string)

resident := NewResident(name, age, address)

resident.HasRequiredInfo()
// => false

3. Elimina le informazioni del residente

La vita va veloce e gli errori capitano. Un residente può trasferirsi fuori città. Un operatore del censimento può commettere errori durante la raccolta dei dati. In questi casi è necessario poter eliminare i dati di un residente, così non verrà conteggiato.

Implementa il metodo Delete che imposta tutti i campi del residente al loro valore zero.

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[]}

4. Conta i residenti

Ora che il sistema supporta i dati del censimento, è il momento di eseguire il censimento e contare i residenti!

Implementa la funzione Count che accetta un argomento:

  • Una slice di puntatori a struct Resident.

La funzione deve restituire un numero intero che indica il numero di residenti conteggiati nel censimento. Un residente può essere conteggiato solo se ha fornito le informazioni richieste all'operatore del censimento.

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
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Go Exercism

Vuoi iniziare Censimento?

Iscriviti a Exercism per imparare e padroneggiare Go con 34 concetti165 esercizi e il mentoring di persone reali, tutto gratis.