Saltar al contenido principal
eLearner.app
Módulo 4 · Lección 2 de 517/50 en el curso~15 min
Lecciones del módulo (2/5)

Slices: la estructura idiomática

Un sector es la estructura de datos más utilizada en Go: una vista dinámica sobre una matriz subyacente. Sintaxis: []T. A diferencia de las matrices, la longitud es no forma parte del tipo y puedes cultivarlo con append.

Anatomía de una rebanada

Internamente, un sector es una estructura de tres campos:

  • un puntero al primer elemento de la matriz subyacente
  • una longitud (len): número de elementos visibles
  • una capacidad (cap): elementos disponibles desde el inicio de la vista hasta el final de la matriz subyacente
Go
s := []int{10, 20, 30}
fmt.Println(len(s), cap(s)) // 3 3

Creación

Go
a := []int{1, 2, 3}          // literal
b := make([]int, 3)          // [0 0 0]   len=3 cap=3
c := make([]int, 3, 10)      // len=3 cap=10 (reserved)
var d []int                  // nil slice: len=0 cap=0, still usable with append

append: asignar siempre el resultado

append agrega elementos y devuelve una nueva porción (potencialmente asignar una nueva matriz si la capacidad es insuficiente):

Go
s := []int{1, 2, 3}
s = append(s, 4)              // [1 2 3 4]
s = append(s, 5, 6, 7)        // append multiple elements
s = append(s, altra...)       // concatenate another slice (spread)

Expresión de segmento s[a:b]

Extrae una subsección de a (inclusive) a b (exclusivo):

Go
s := []int{10, 20, 30, 40, 50}
sub := s[1:4]              // [20 30 40]
inizio := s[:2]            // [10 20]
fine := s[3:]              // [40 50]
intera := s[:]             // [10 20 30 40 50]

Los subporciones comparten la matriz subyacente con la porción original: Las mutaciones a través de sub[i] = ... también son visibles en s.

Error: compartir matrices

Go
s := []int{1, 2, 3, 4}
sub := s[0:2]
sub[0] = 99
fmt.Println(s)             // [99 2 3 4] — modified!

Para obtener una copia independiente, utilice copy o append:

Go
out := make([]int, len(sub))
copy(out, sub)

Pruébalo

Ejercicio#go.m4.l2.e1
Intentos: 0Cargando...

Cree un segmento s con [1, 2, 3] y use append para agregar 4.

Cargando editor...
Mostrar pista

SIEMPRE asigne el resultado de agregar nuevamente a `s`.

Solución disponible después de 3 intentos

Ejercicio#go.m4.l2.e2
Intentos: 0Cargando...

Utilice una expresión de sector para extraer elementos del índice 1 inclusive al 3 exclusivo (es decir, [20, 30]).

Cargando editor...
Mostrar pista

Sintaxis: `s[start:end]`, `start` inclusive, `end` exclusivo.

Solución disponible después de 3 intentos

Cuestionario#go.m4.l2.e3
Listo

¿Cuál de estos es MAL escribir?

Go
s := []int{1, 2, 3}
// (a) s = append(s, 4)
// (b) append(s, 4)
Opciones de respuesta

Resumen

  • []T: vista dinámica sobre una matriz; triple (ptr, len, cap).
  • make([]T, len, cap) para preasignar; var s []T para una porción nula utilizable.
  • s = append(s, ...): SIEMPRE asigna el resultado.
  • s[a:b] comparte la matriz subyacente: copy(...) para copias independientes.
  • Un segmento nil = OK para leer/intervalo/añadir; bastante diferente de un mapa nulo.