Η Go δεν έχει την έννοια του κενού, του null ή του undefined για τις τιμές των μεταβλητών. Οι μεταβλητές που δηλώνονται χωρίς ρητή αρχική τιμή παίρνουν εξ ορισμού τη μηδενική τιμή του αντίστοιχου τύπου τους.
Η μηδενική τιμή για τους πρωτογενείς τύπους, όπως οι τύποι Boolean, οι αριθμητικοί τύποι και οι συμβολοσειρές, είναι αντίστοιχα false, 0 και "".
Το αναγνωριστικό nil, που σημαίνει μηδέν, είναι η μηδενική τιμή για πιο σύνθετους τύπους, όπως δείκτες, συναρτήσεις, διεπαφές, φέτες, κανάλια και χάρτες.
Ο παρακάτω πίνακας παρουσιάζει αναλυτικά τη μηδενική τιμή για τους τύπους της Go.
| Τύπος | Μηδενική τιμή |
|---|---|
| Boolean | false |
| αριθμητικός | 0 |
| συμβολοσειρά | "" |
| δείκτης | nil |
| συνάρτηση | nil |
| διεπαφή | nil |
| φέτα | nil |
| κανάλι | nil |
| χάρτης | nil |
Ίσως παρατήρησες ότι οι τύποι struct απουσιάζουν από τον παραπάνω πίνακα. Αυτό συμβαίνει επειδή η μηδενική τιμή ενός τύπου struct εξαρτάται από τα πεδία του. Τα struct παίρνουν τη μηδενική τους τιμή όταν όλα τα πεδία τους πάρουν την αντίστοιχη μηδενική τιμή.
Δική σου δουλειά είναι να προετοιμάσεις το σύστημα πληροφορικής της πόλης για μια επερχόμενη απογραφή. Πιο συγκεκριμένα, η ευθύνη σου είναι το πρόγραμμα που θα επεξεργάζεται τα δεδομένα των απογραφέων.
Το πρόγραμμα πρέπει να μπορεί να δημιουργεί έναν νέο κάτοικο στο σύστημα, όταν του δίνονται τα στοιχεία του κατοίκου. Επιπλέον, θα δημιουργήσεις συναρτήσεις που διασφαλίζουν ότι τα απαιτούμενα στοιχεία υπάρχουν στα δεδομένα του κατοίκου, καθώς και μια συνάρτηση που διαγράφει τα δεδομένα ενός κατοίκου. Τέλος, θα μετρήσεις τους κατοίκους για να έχεις έναν ακριβή αριθμό απογραφής.
Όταν ένας απογραφέας συλλέγει τα στοιχεία ενός κατοίκου, πρέπει να τον καταχωρίσει στο σύστημα, εισάγοντας το όνομα, την ηλικία και τη διεύθυνσή του.
Υλοποίησε τη συνάρτηση NewResident που δέχεται τρία ορίσματα:
Η συνάρτηση πρέπει να επιστρέφει έναν δείκτη σε μια δομή Resident που περιέχει αυτά τα στοιχεία.
name := "Matthew Sanabria"
age := 29
address := map[string]string{"street": "Main St."}
NewResident(name, age, address)
// => &{Matthew Sanabria 29 map[street:Main St.]}
Οι κάτοικοι μπορεί να διστάζουν να δώσουν προσωπικά δεδομένα στους απογραφείς. Σε αυτές τις περιπτώσεις, είναι απαραίτητο να προσδιορίσεις αν ο κάτοικος έδωσε τα απαιτούμενα στοιχεία για να μετρηθεί στην απογραφή.
Για να μετρηθεί, ένας κάτοικος πρέπει να δώσει μια μη μηδενική τιμή για το όνομα του και μια διεύθυνση που περιέχει μια μη μηδενική τιμή για το κλειδί street.
Όλα τα άλλα στοιχεία, όπως η ηλικία του κατοίκου, είναι προαιρετικά.
Υλοποίησε τη μέθοδο HasRequiredInfo που επιστρέφει μια τιμή Boolean, δείχνοντας αν ο κάτοικος έδωσε τα απαιτούμενα στοιχεία.
name := "Matthew Sanabria"
age := 0
address := make(map[string]string)
resident := NewResident(name, age, address)
resident.HasRequiredInfo()
// => false
Η ζωή τρέχει γρήγορα και τα λάθη συμβαίνουν. Ένας κάτοικος μπορεί να μετακομίσει έξω από την πόλη. Ένας απογραφέας μπορεί να κάνει λάθη κατά τη συλλογή δεδομένων. Σε αυτές τις περιπτώσεις, είναι απαραίτητο να μπορείς να διαγράψεις τα δεδομένα ενός κατοίκου, ώστε να μην μετρηθεί.
Υλοποίησε τη μέθοδο Delete που θέτει όλα τα πεδία του κατοίκου στη μηδενική τους τιμή.
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[]}
Τώρα που το σύστημα υποστηρίζει δεδομένα απογραφής, ήρθε η ώρα να κάνεις την απογραφή και να μετρήσεις τους κατοίκους!
Υλοποίησε τη συνάρτηση Count που δέχεται ένα όρισμα:
Resident.Η συνάρτηση πρέπει να επιστρέφει έναν ακέραιο που δείχνει τον αριθμό των κατοίκων που μετρήθηκαν στην απογραφή. Ένας κάτοικος μπορεί να μετρηθεί μόνο αν έδωσε τα απαιτούμενα στοιχεία στον απογραφέα.
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
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Go με 34 έννοιες166 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.