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