Senior
Dacă lucrez cu un slice, îl iau ca parametru al funcției, fac ceva cu el și continui să lucrez cu el după funcție — la ce trebuie să fiu atent? Ce schimbări nu vom vedea din exterior?
sobes.tech AI
Răspuns de la AI
În Go, un slice este o structură care conține un pointer către un array, o lungime și o capacitate. Când pasezi un slice într-o funcție, se copiază doar această structură (pointer, lungime, capacitate), nu array-ul în sine.
Ce este important să reții:
- Modificările elementelor slice-ului în interiorul funcției (de exemplu,
s[0] = 10) vor fi vizibile în afară, deoarece indică același array. - Modificările structurii slice-ului în sine (de exemplu, atribuirea unui nou slice
s = append(s, 5)) nu vor afecta slice-ul în afară, deoarece doar structura este copiată.
Exemplu:
func modify(s []int) {
s[0] = 100 // va modifica elementul array-ului — vizibil în afară
s = append(s, 200) // modifică copia locală a slice-ului — nu se vede în afară
}
s := []int{1, 2, 3}
modify(s)
fmt.Println(s) // Va afișa [100 2 3], adăugarea de 200 nu se va reflecta
Pe scurt, modificările elementelor slice-ului sunt vizibile în afară, dar modificările lungimii sau capacității (prin append, slices) nu, dacă nu returnezi un nou slice sau nu pasezi un pointer către slice.