Senior
Αν εργάζομαι με ένα slice, το παίρνω ως παράμετρο της συνάρτησης, κάνω κάτι με αυτό και συνεχίζω να δουλεύω μαζί του μετά τη συνάρτηση — τι πρέπει να θυμάμαι; Ποιες αλλαγές δεν θα δούμε από έξω;
sobes.tech AI
Απάντηση από AI
Στη Go, ένα slice είναι μια δομή που περιέχει έναν δείκτη σε έναν πίνακα, μήκος και χωρητικότητα. Όταν περνάτε ένα slice σε μια συνάρτηση, αντιγράφεται μόνο αυτή η δομή (δείκτης, μήκος, χωρητικότητα), όχι ο πίνακας ο ίδιος.
Το σημαντικό να θυμάστε:
- Οι αλλαγές στα στοιχεία του slice μέσα στη συνάρτηση (π.χ.,
s[0] = 10) θα είναι ορατές από έξω, καθώς δείχνουν στον ίδιο πίνακα. - Οι αλλαγές στη δομή του slice (π.χ., ανάθεση ενός νέου slice
s = append(s, 5)) δεν θα επηρεάσουν το slice έξω από τη συνάρτηση, καθώς αντιγράφεται μόνο η δομή.
Παράδειγμα:
func modify(s []int) {
s[0] = 100 // θα αλλάξει το στοιχείο του πίνακα — θα φαίνεται από έξω
s = append(s, 200) // τροποποιεί το τοπικό αντίγραφο του slice — δεν φαίνεται από έξω
}
s := []int{1, 2, 3}
modify(s)
fmt.Println(s) // Θα εκτυπώσει [100 2 3], η προσθήκη του 200 δεν θα αντικατοπτρίζεται
Συνοπτικά, οι αλλαγές στα στοιχεία του slice είναι ορατές από έξω, αλλά οι αλλαγές στο μήκος ή στη χωρητικότητα (μέσω append, slices) — όχι, εκτός αν επιστρέψετε ένα νέο slice ή περάσετε δείκτη στο slice.