Junior
Ποια είναι η βασική διαφορά μεταξύ slices και arrays στο Go;
sobes.tech AI
Απάντηση από AI
Οι slices είναι δυναμικά μεταβαλλόμενες προβολές των arrays.
| Χαρακτηριστικό | Array | Slice |
|---|---|---|
| Μέγεθος | Σταθερό, καθορίζεται κατά τη δημιουργία | Δυναμικό, μπορεί να αλλάξει |
| Τύπος | [n]T (όπου n το μέγεθος, T ο τύπος) |
[]T (όπου T ο τύπος) |
| Μεταβίβαση σε συναρτήσεις | Αντίγραφο (αξίας) | Με αναφορά στο υποκείμενο array, περνούν head, len και cap (στην πραγματικότητα, δημιουργείται μια νέα δομή SliceHeader με αντίγραφα αυτών των πεδίων) |
| Δημιουργία | var a [5]int ή b := [3]string{"a", "b", "c"} |
var s []int ή t := []int{1, 2, 3} ή u := make([]int, 5) |
| Απόδοση | Πιο προβλέψιμη λόγω σταθερού μεγέθους, μπορεί να είναι πιο αποδοτική σε μικρά μεγέθη | Μπορεί να έχει πρόσθετο κόστος κατά την αλλαγή μεγέθους (ανακατανομή του υποκείμενου array) |
// Παράδειγμα array
var arr [3]int = [3]int{1, 2, 3}
// Παράδειγμα slice που δημιουργείται από array
slice := arr[1:] // slice {2, 3}
// Παράδειγμα δημιουργίας slice
s := []int{10, 20, 30} // υποκείμενο array {10, 20, 30}, μήκος = 3, χωρητικότητα = 3
// Τροποποίηση του slice
s = append(s, 40) // τώρα s {10, 20, 30, 40}. Αν η χωρητικότητα δεν επαρκεί, δημιουργείται νέο υποκείμενο array, μήκος = 4, χωρητικότητα = 6 (συνήθως διπλασιάζεται η χωρητικότητα).
// Τροποποίηση στοιχείου του slice αλλάζει το υποκείμενο array
slice[0] = 99 // arr τώρα {1, 99, 3}
fmt.Println(arr)