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