Στη Go, το map είναι ένας ενσωματωμένος τύπος δεδομένων που αντιστοιχίζει κλειδιά σε τιμές.
Σε άλλες γλώσσες προγραμματισμού, ίσως να είσαι εξοικειωμένος με την έννοια του map ως λεξικό, πίνακα κατακερματισμού, αποθήκη κλειδιού/τιμής ή συσχετιστικό πίνακα.
Συντακτικά, το map μοιάζει κάπως έτσι:
map[KeyType]ElementType
Είναι επίσης σημαντικό να ξέρεις ότι κάθε κλειδί είναι μοναδικό, που σημαίνει ότι αν αναθέσεις το ίδιο κλειδί δύο φορές, θα αντικατασταθεί η τιμή του αντίστοιχου κλειδιού.
Για να δημιουργήσεις ένα map, μπορείς να κάνεις:
// With map literal
foo := map[string]int{}
ή
// or with make function
foo := make(map[string]int)
Εδώ είναι μερικές πράξεις που μπορείς να κάνεις με ένα map
// Add a value in a map with the `=` operator:
foo["bar"] = 42
// Here we update the element of `bar`
foo["bar"] = 73
// To retrieve a map value, you can use
baz := foo["bar"]
// To delete an item from a map, you can use
delete(foo, "bar")
Αν προσπαθήσεις να ανακτήσεις την τιμή για ένα κλειδί που δεν υπάρχει στο map, θα σου επιστρέψει τη μηδενική τιμή του τύπου τιμών.
Αυτό μπορεί να σε μπερδέψει, ειδικά αν η προεπιλεγμένη τιμή του ElementType σου (για παράδειγμα, το 0 για έναν int) είναι μια έγκυρη τιμή.
Για να ελέγξεις αν ένα κλειδί υπάρχει στο map σου, μπορείς να χρησιμοποιήσεις
value, exists := foo["baz"]
// If the key "baz" does not exist,
// value: 0; exists: false
Ένας φίλος σου έχει ένα παλιό κατάστημα χονδρικής που λέγεται Gross Store. Το όνομα προέρχεται από την ποσότητα των ειδών που πουλάει το κατάστημα: όλα είναι σε μονάδες gross. Ο φίλος σου σου ζήτησε να υλοποιήσεις ένα σύστημα σημείου πώλησης (POS) για το κατάστημά του. Πρώτα, θέλεις να φτιάξεις ένα πρωτότυπο γι' αυτό. Στο πρωτότυπό σου, το σύστημα θα καταγράφει μόνο την ποσότητα. Ο φίλος σου σου έδωσε μια λίστα με μονάδες μέτρησης για να σε βοηθήσει:
| Μονάδα | Αξία |
|---|---|
| quarter_of_a_dozen | 3 |
| half_of_a_dozen | 6 |
| dozen | 12 |
| small_gross | 120 |
| gross | 144 |
| great_gross | 1728 |
Για να χρησιμοποιήσεις τη μονάδα μέτρησης, πρέπει να την αποθηκεύσεις στο πρόγραμμά σου.
units := Units()
fmt.Println(units)
// Output: map[...] with entries like ("dozen": 12)
Πρέπει να υλοποιήσεις μια συνάρτηση που δημιουργεί έναν νέο (κενό) λογαριασμό για τον πελάτη.
bill := NewBill()
fmt.Println(bill)
// Output: map[]
Για να το υλοποιήσεις, θα χρειαστεί να:
false αν το unit που δίνεται δεν υπάρχει στο map units.bill του πελάτη, με κλειδί το όνομα του είδους, και μετά να επιστρέψεις true.unit που δίνεται.bill := NewBill()
units := Units()
ok := AddItem(bill, units, "carrot", "dozen")
fmt.Println(ok)
// Output: true (since dozen is a valid unit)
Σημείωσε ότι η τιμή που επιστρέφεται είναι τύπου
bool.
Για να το υλοποιήσεις, θα χρειαστεί να:
false αν το είδος που δίνεται δεν υπάρχει στον λογαριασμόfalse αν το unit που δίνεται δεν υπάρχει στο map units.false αν η νέα ποσότητα θα ήταν μικρότερη από 0.bill και μετά να επιστρέψεις true.true.bill := NewBill()
units := Units()
ok := RemoveItem(bill, units, "carrot", "dozen")
fmt.Println(ok)
// Output: false (because there are no carrots in the bill)
Σημείωσε ότι η τιμή που επιστρέφεται είναι τύπου
bool.
Για να το υλοποιήσεις, θα χρειαστεί να:
0 και false αν το item δεν υπάρχει στον λογαριασμό.bill και true.bill := map[string]int{"carrot": 12, "grapes": 3}
qty, ok := GetItem(bill, "carrot")
fmt.Println(qty)
// Output: 12
fmt.Println(ok)
// Output: true
Σημείωσε ότι οι τιμές που επιστρέφονται είναι τύπων
intκαιbool.
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Go με 34 έννοιες165 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.