GoIntermedio6 oct 2025
El Slice Fantasma que Nunca Muere
snippet.go
package main
import "fmt"
func main() {
data := []int{1, 2, 3, 4, 5}
subslice := data[1:3]
fmt.Println("Antes de append:")
fmt.Printf("data: %v\n", data)
fmt.Printf("subslice: %v\n", subslice)
// Modificamos el subslice
subslice[0] = 999
fmt.Println("\nDespués de modificar subslice:")
fmt.Printf("data: %v\n", data)
fmt.Printf("subslice: %v\n", subslice)
// Hacemos append al slice original
data = append(data, 6)
fmt.Println("\nDespués de append a data:")
fmt.Printf("data: %v\n", data)
fmt.Printf("subslice: %v\n", subslice)
// Modificamos el subslice otra vez
subslice[0] = 777
fmt.Println("\nDespués de segunda modificación:")
fmt.Printf("data: %v\n", data)
fmt.Printf("subslice: %v\n", subslice)
}¿Qué crees que imprime?
✅ Salida Esperada
Antes de append:
data: [1 2 3 4 5]
subslice: [2 3]
Después de modificar subslice:
data: [1 999 3 4 5]
subslice: [999 3]
Después de append a data:
data: [1 999 3 4 5 6]
subslice: [999 3]
Después de segunda modificación:
data: [1 999 3 4 5 6]
subslice: [777 3]⚠️ Salida Real
Antes de append:
data: [1 2 3 4 5]
subslice: [2 3]
Después de modificar subslice:
data: [1 999 3 4 5]
subslice: [999 3]
Después de append a data:
data: [1 999 3 4 5 6]
subslice: [999 3]
Después de segunda modificación:
data: [1 777 3 4 5 6]
subslice: [777 3]¿Por qué pasa esto?
**Go tiene un comportamiento vampírico** con los slices. Aquí tenemos:
- Los slices comparten el **array subyacente** con su slice padre
- Cuando haces `append` y se **supera la capacidad**, Go crea un nuevo array
- Pero el **subslice viejo sigue apuntando al array original** como un fantasma
- Al modificar el subslice fantasma, **¡afectas al array original que ya no debería existir!**
Resultado: **¡Tu slice muerto sigue vivo y modificando datos!** 🧛♂️
Conceptos relacionados
slicesmemory-managementappend