Sobes.tech
Senior

Τι είναι ένα slice; Τι συμβαίνει κάτω από το καπό ενός slice; Πώς λειτουργεί η λειτουργία append;

sobes.tech AI

Απάντηση από AI

Στη Go, ένα slice είναι ένας δυναμικός πίνακας που αντιπροσωπεύει μια δομή με τρία πεδία:

  • Δείκτης προς τον πίνακα (υποκείμενος πίνακας στη μνήμη)
  • Μήκος (len) — ο αριθμός των στοιχείων διαθέσιμων στο slice
  • Χωρητικότητα (cap) — ο μέγιστος αριθμός στοιχείων που μπορεί να χωρέσει ο υποκείμενος πίνακας από τον δείκτη

Πίσω από τις σκηνές, ένα slice είναι μια μικρή δομή, περίπου έτσι:

type sliceHeader struct {
    Data uintptr // δείκτης στο πρώτο στοιχείο του πίνακα
    Len  int
    Cap  int
}

Η λειτουργία append προσθέτει στοιχεία στο slice. Αν το μήκος του slice είναι μικρότερο από τη χωρητικότητα, το append απλώς γράφει τα νέα στοιχεία στον υποκείμενο πίνακα και αυξάνει το μήκος. Αν το μήκος φτάσει στη χωρητικότητα, το append εκχωρεί έναν νέο πίνακα με αυξημένη χωρητικότητα (συνήθως διπλάσια), αντιγράφει τα παλιά στοιχεία, προσθέτει τα νέα και επιστρέφει ένα νέο slice με ενημερωμένο δείκτη.

Παράδειγμα:

s := []int{1, 2, 3}
s = append(s, 4) // αν cap(s) > len(s), απλώς προσθέτει το 4

// αν cap(s) == len(s), εκχωρεί έναν νέο πίνακα, αντιγράφει [1,2,3], προσθέτει το 4

Έτσι, το append μπορεί να επιστρέψει ένα νέο slice, και είναι σημαντικό να αναθέσετε το αποτέλεσμα ξανά.