Sobes.tech
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.