Junior
Πώς να δουλέψετε με slices στο Go;
sobes.tech AI
Απάντηση από AI
Οι slices στο Go δεν είναι πίνακες, αλλά αναφέρονται σε ένα τμήμα (ή ολόκληρο) του βασικού πίνακα. Είναι δυναμικές δομές δεδομένων.
Δημιουργία slices:
- Από έναν πίνακα:
// ορισμός πίνακα
arr := [5]int{1, 2, 3, 4, 5}
// δημιουργία slice από μέρος του πίνακα
s1 := arr[1:4] // s1 περιέχει τα στοιχεία arr[1], arr[2], arr[3]
// δημιουργία άλλου slice
s2 := arr[:3] // s2 περιέχει τα στοιχεία arr[0], arr[1], arr[2]
// ένα slice που αναφέρεται σε όλο τον πίνακα
s3 := arr[2:] // s3 περιέχει τα στοιχεία arr[2], arr[3], arr[4]
// ένα slice που αναφέρεται σε όλο τον πίνακα
s4 := arr[:]
- Με
make:
// Δημιουργία slice με μήκος 5 και χωρητικότητα 5
s := make([]int, 5)
// Δημιουργία slice με μήκος 5 και χωρητικότητα 10
s_cap := make([]int, 5, 10)
- Λιτό:
s := []int{1, 2, 3}
Βασικές ιδιότητες του slice:
len(s): επιστρέφει το τρέχον μήκος του slice.cap(s): επιστρέφει τη χωρητικότητα του slice (το μέγιστο αριθμό στοιχείων που μπορεί να περιέχει πριν από επανατοποθέτηση).
Προσθήκη στοιχείων (append):
s := []int{1, 2}
s = append(s, 3) // προσθέτει ένα στοιχείο
s = append(s, 4, 5) // προσθέτει πολλά στοιχεία
s2 := []int{6, 7}
s = append(s, s2...) // προσθέτει τα στοιχεία ενός άλλου slice
Το append μπορεί να προκαλέσει επανατοποθέτηση του βασικού πίνακα αν η χωρητικότητα δεν είναι αρκετή.
Διαγραφή στοιχείων:
Η διαγραφή στοιχείων από ένα slice επιτυγχάνεται δημιουργώντας ένα νέο slice με τα υπόλοιπα στοιχεία ή με αντιγραφή.
s := []int{1, 2, 3, 4, 5}
// Διαγραφή στοιχείου στη θέση i
i := 2 // διαγράφουμε το στοιχείο στη θέση 2 (δηλαδή το 3)
s = append(s[:i], s[i+1:]...)
Αντιγραφή slices:
src := []int{1, 2, 3}
dst := make([]int, len(src))
copy(dst, src) // αντιγράφει τα στοιχεία από το src στο dst
Το copy αντιγράφει το ελάχιστο μήκος των δύο slices.
Επανάληψη σε slice:
s := []string{"a", "b", "c"}
for i, v := range s {
// i - δείκτης, v - τιμή
}
for i := range s {
// μόνο ο δείκτης
}
for _, v := range s {
// μόνο η τιμή
}
Οι slices είναι τύποι αναφοράς:
Οι αλλαγές σε ένα slice αντικατοπτρίζονται στον βασικό πίνακα και σε άλλα slices που αναφέρονται στην ίδια περιοχή μνήμης.
arr := [5]int{1, 2, 3, 4, 5}
s1 := arr[1:4] // [2, 3, 4]
s2 := arr[2:5] // [3, 4, 5]
s1[0] = 99
// Τώρα arr: [1, 99, 3, 4, 5]
// s1: [99, 3, 4]
// s2: [3, 4, 5] (το στοιχείο arr[2] άλλαξε)