Πώς λειτουργεί ο τύπος δεδομένων Map στο Go;
sobes.tech AI
Απάντηση από AI
Ο χάρτης — είναι μια μη ταξινομημένη συλλογή από ζεύγη "κλειδί-τιμή" σε Go.
Χαρακτηριστικά:
- Τα κλειδιά πρέπει να είναι συγκρίσιμους τύπους δεδομένων (αριθμοί, συμβολοσειρές, boolean, δείκτες, κανάλια, διεπαφές, αν ο δυναμικός τύπος είναι συγκρίσιμος, και πίνακες αν τα στοιχεία τους είναι συγκρίσιμα). Δεν μπορούν να χρησιμοποιηθούν slices, συναρτήσεις ή άλλοι χάρτες ως κλειδιά.
- Οι τιμές μπορούν να είναι οποιουδήποτε τύπου δεδομένων.
- Ο χάρτης είναι τύπος αναφοράς, που σημαίνει ότι μια μεταβλητή τύπου map περιέχει έναν δείκτη στη δομή δεδομένων του χάρτη στη μνήμη. Οι αλλαγές στον χάρτη μέσω μιας μεταβλητής θα είναι ορατές μέσω άλλων μεταβλητών που αναφέρονται στον ίδιο χάρτη.
- Η μηδενική τιμή για τον χάρτη είναι
nil. Δεν μπορεί να γραφτεί σεnilχάρτη; η προσπάθεια θα προκαλέσει panic. - Το μέγεθος του χάρτη αλλάζει δυναμικά καθώς προστίθενται ή διαγράφονται στοιχεία.
Εσωτερική υλοποίηση: Ο χάρτης σε Go υλοποιείται ως πίνακας κατακερματισμού (hash table). Κάθε κλειδί κατακερματίζεται, και το αποτέλεσμα του κατακερματισμού χρησιμοποιείται για τον προσδιορισμό της θέσης της σχετικής τιμής στον πίνακα.
// Δημιουργία χάρτη
m := make(map[string]int)
// Προσθήκη στοιχείων
m["ένα"] = 1
m["δύο"] = 2
// Απόκτηση τιμής
value, ok := m["ένα"] // value = 1, ok = true
value, ok = m["τρία"] // value = 0 (μηδενική τιμή για int), ok = false
// Διαγραφή στοιχείου
delete(m, "δύο")
// Επανάληψη στον χάρτη (η σειρά δεν εγγυάται)
for key, value := range m {
// ...
}
Σύγκριση χαρτών: Δύο χάρτες θεωρούνται ίσοι μόνο αν αναφέρονται στην ίδια εσωτερική δομή, δηλαδή, map1 == map2 μόνο αν map1 και map2 είναι η ίδια μεταβλητή. Δεν επιτρέπεται η σύγκριση του περιεχομένου ενός χάρτη με τον τελεστή ==. Για να συγκρίνετε το περιεχόμενο, πρέπει να επαναλάβετε και τους δύο χάρτες και να συγκρίνετε τα στοιχεία τους.
Απόδοση: Οι λειτουργίες πρόσβασης, προσθήκης και διαγραφής σε έναν χάρτη έχουν μέση πολυπλοκότητα O(1). Στην χειρότερη περίπτωση (π.χ., με πολλές συγκρούσεις κατακερματισμού), μπορεί να χρειαστούν O(n) χρόνο.