Sobes.tech
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] άλλαξε)