10 Slicing y Ranging
Published Apr 24, 2023
GoProgrammingRangeSlice
🧠 Introducción
En esta lección aprenderás a trabajar con subconjuntos de datos, copiar, insertar y eliminar elementos en slices. Son operaciones fundamentales para manipular colecciones de forma eficiente y flexible.
1. ✂️ Slicing en Go
El slicing permite extraer una parte de un array o slice.
🔤 Sintaxis:
go
CopyEdit
slice[start:end]
start
: índice de inicio (incluido).end
: índice final (excluido).
✅ Ejemplo:
go
CopyEdit
c := [4]string{"iOS", "Android", "Windows", "MacOS"}
fmt.Println(c[0:2]) // ["iOS", "Android"]
fmt.Println(c[:2]) // ["iOS", "Android"]
fmt.Println(c[1:]) // ["Android", "Windows", "MacOS"]
fmt.Println(c[:]) // Todos los elementos
2. 🧠 Slicing y Memoria
Cuando haces slicing, el nuevo slice comparte el mismo array subyacente. Los cambios afectan a ambos.
go
CopyEdit
t := []int{1, 2, 3, 4, 5}
t = t[2:4]
fmt.Println(t) // [3 4]
fmt.Println(len(t)) // 2
fmt.Println(cap(t)) // 3 → porque hay espacio después del índice 2
3. 🔁 Iterar sobre Slices o Arrays
Usamos for-range
:
go
CopyEdit
t := []int{1, 2, 3, 4, 5}
for i, v := range t {
fmt.Printf("Índice: %d, Valor: %d\n", i, v)
}
4. 🧬 Copiar Slices
Para crear una copia independiente, usa copy
.
go
CopyEdit
t := []int{1, 2, 3, 4, 5}
v := make([]int, len(t))
copy(v, t)
v[0] = 99
fmt.Println(t) // [1 2 3 4 5]
fmt.Println(v) // [99 2 3 4 5]
Si el slice destino es más pequeño, solo se copian los elementos que quepan.
go
CopyEdit
v := make([]int, 2)
copy(v, t)
fmt.Println(v) // [1 2]
5. ➕ Insertar Elementos
Go no tiene una función incorporada, pero puedes usar append
+ slicing:
go
CopyEdit
func insert(orig []int, index int, value int) ([]int, error) {
if index < 0 {
return nil, errors.New("Index cannot be less than 0")
}
if index >= len(orig) {
return append(orig, value), nil
}
orig = append(orig[:index+1], orig[index:]...)
orig[index] = value
return orig, nil
}
go
CopyEdit
t := []int{1, 2, 3, 4, 5}
t, err := insert(t, 2, 99)
fmt.Println(t) // [1 2 99 3 4 5]
6. ❌ Eliminar Elementos
Puedes eliminar elementos usando append
:
go
CopyEdit
func delete(orig []int, index int) ([]int, error) {
if index < 0 || index >= len(orig) {
return nil, errors.New("Index out of range")
}
return append(orig[:index], orig[index+1:]...), nil
}
go
CopyEdit
t := []int{1, 2, 3, 4, 5}
t, err := delete(t, 2)
fmt.Println(t) // [1 2 4 5]
✅ Conclusión
- Slicing te permite trabajar con subconjuntos de datos.
- Los slices comparten memoria con el array original, salvo que uses
copy
. - Puedes insertar o eliminar elementos combinando slicing y
append
. - Estas operaciones te permiten escribir código más flexible y eficiente.
🛠️ Práctica recomendada
- Crea un slice con los números del 1 al 10.
- Usa slicing para obtener:
- Los primeros 3.
- Los últimos 4.
- Del elemento 3 al 6 (sin incluir el índice 6).
- Crea una copia del slice y modifica el primero de la copia. Verifica que el original no cambie.
- Inserta el valor
99
en la posición 5. - Elimina el valor de la posición 2.
🚀 Siguientes pasos
Con estas habilidades puedes trabajar con cualquier colección en Go. Te recomiendo continuar con:
- 🧱 Structs en Go: para crear tus propios tipos de datos.
- 🔑 Maps: colecciones clave-valor para acceso rápido.
- 🧠 Funciones avanzadas con slices: filtrar, buscar y transformar colecciones.