Cuando construyes una aplicación de lista de tareas en Go, necesitas una estructura de datos que permita crecer y reducirse conforme el usuario agrega o elimina elementos. Los arrays tradicionales no resuelven este problema porque su tamaño es fijo. Aquí es donde los slices se convierten en la herramienta fundamental para manejar colecciones dinámicas.
¿Por qué los slices son más flexibles que los arrays en Go?
En Go, un arreglo (array) es una estructura de tamaño fijo [01:00]. Una vez que declaras su longitud, no puedes agregar ni remover elementos: queda escrito en piedra. Los slices, en cambio, son estructuras de longitud variable que permiten insertar y eliminar elementos de forma dinámica [01:18].
Para declarar un slice, se utiliza una sintaxis con corchetes vacíos antes del tipo:
go
type TaskList struct {
Tasks []*Task
}
El asterisco (*) indica que estamos trabajando con apuntadores (pointers), lo cual garantiza que las modificaciones se apliquen sobre los datos reales y no sobre copias [02:04]. Este patrón ya lo vimos cuando actualizábamos nombre, descripción o estado de completado en una tarea individual.
¿Cómo agregar elementos a un slice con append?
Para insertar una tarea nueva en la lista, se crea un método receiver sobre TaskList [02:24]. La función built-in append recibe dos parámetros: el slice actual y el elemento que deseas añadir.
go
func (tl *TaskList) AgregarALista(task *Task) {
tl.Tasks = append(tl.Tasks, task)
}
tl.Tasks es el slice existente.
task es la nueva tarea que se incorpora.
- append retorna un slice nuevo con el elemento agregado [03:06].
¿Cómo preinicializar un slice dentro de un struct?
Al crear la lista en main, puedes preinicializar el slice con elementos existentes [04:06]:
go
lista := TaskList{
Tasks: []*Task{
t1,
t2,
},
}
Un detalle importante de sintaxis: siempre debes colocar una coma después del último elemento, incluso si no hay otro elemento después [04:40]. Sin esa coma, Go marca error de compilación.
¿Cómo verificar la longitud del slice con len?
La función len devuelve la cantidad de elementos en un slice [06:10]. Es útil para confirmar que las operaciones de agregar o eliminar funcionaron correctamente:
go
fmt.Println(len(lista.Tasks))
Tras preinicializar con dos tareas y agregar una tercera mediante AgregarALista, el resultado es 3 [06:36].
¿Cómo eliminar elementos de un slice en Go?
La estrategia para eliminar consiste en reconstruir el slice tomando todos los elementos a la izquierda del índice y todos los de la derecha, omitiendo el elemento objetivo [07:16].
go
func (tl *TaskList) EliminarDeLista(index int) {
tl.Tasks = append(tl.Tasks[:index], tl.Tasks[index+1:]...)
}
tl.Tasks[:index] selecciona los elementos antes del índice.
tl.Tasks[index+1:] selecciona los elementos después del índice.
- Los tres puntos (
...) son el operador de expansión (spread), necesario para que append reciba los elementos individuales del segundo slice [08:22].
El método recibe un índice como parámetro, no una tarea directamente [07:36]. Al eliminar el elemento en la posición 1 de una lista con tres tareas, la longitud baja a 2 [08:52].
go
lista.EliminarDeLista(1)
fmt.Println(len(lista.Tasks)) // Imprime: 2
Con estas dos operaciones —agregar y eliminar— la lista de tareas ya funciona de manera completa. Append es la pieza central para manipular slices en Go, y dominar su uso junto con la notación de rangos (:index, index+1:) te da control total sobre colecciones dinámicas. ¿Qué otra funcionalidad agregarías a esta lista de tareas? Comparte tus ideas en los comentarios.