Sobes.tech
Senior

Si trabajo con un slice, lo tomo como un parámetro de función, hago algo con él y luego continúo trabajando con él después de la función, ¿qué debo recordar? ¿Qué cambios no veremos desde fuera?

sobes.tech AI

Respuesta de la IA

En Go, un slice es una estructura que contiene un puntero a un array, una longitud y una capacidad. Cuando pasas un slice a una función, solo se copia esta estructura (puntero, longitud, capacidad), no el array en sí.

Lo importante a recordar:

  • Los cambios en los elementos del slice dentro de la función (por ejemplo, s[0] = 10) serán visibles desde fuera, ya que apuntan al mismo array.
  • Los cambios en la propia estructura del slice (por ejemplo, asignar un nuevo slice s = append(s, 5)) no afectarán al slice fuera de la función, ya que solo se copia la estructura.

Ejemplo:

func modify(s []int) {
    s[0] = 100       // cambiará el elemento del array — será visible desde fuera
    s = append(s, 200) // modifica la copia local del slice — no será visible desde fuera
}

s := []int{1, 2, 3}
modify(s)
fmt.Println(s) // Imprimirá [100 2 3], la adición de 200 no se reflejará

En resumen, los cambios en los elementos del slice son visibles desde fuera, pero los cambios en la longitud o capacidad (a través de append, slices) no, a menos que devuelvas un nuevo slice o pases un puntero al slice.