Senior
¿Qué es un slice? ¿Qué hay debajo del capó de un slice? ¿Cómo funciona la función append?
sobes.tech AI
Respuesta de la IA
En Go, un slice es un array dinámico que representa una estructura con tres campos:
- Puntero al array (array subyacente en memoria)
- Longitud (len) — número de elementos disponibles en el slice
- Capacidad (cap) — número máximo de elementos que puede contener el array subyacente empezando desde el puntero
Detrás de escena, un slice es una pequeña estructura, aproximadamente así:
type sliceHeader struct {
Data uintptr // puntero al primer elemento del array
Len int
Cap int
}
La función append añade elementos al slice. Si la longitud del slice es menor que la capacidad, append simplemente escribe los nuevos elementos en el array subyacente y aumenta la longitud. Si la longitud alcanza la capacidad, append asigna un nuevo array con mayor capacidad (usualmente el doble), copia los elementos antiguos, añade los nuevos, y devuelve un nuevo slice con el puntero actualizado.
Ejemplo:
s := []int{1, 2, 3}
s = append(s, 4) // si cap(s) > len(s), simplemente añadirá 4
// si cap(s) == len(s), asignará un nuevo array, copiará [1,2,3], añadirá 4
De esta forma, append puede devolver un nuevo slice, y es importante asignar el resultado de nuevo.