Arrays, Slices y Maps de un Vistazo
Los arrays son valores de tamaño fijo; los slices y maps son colecciones similares a referencias integradas en el lenguaje.
Busca en todas las páginas de la documentación
Los arrays son valores de tamaño fijo; los slices y maps son colecciones similares a referencias integradas en el lenguaje.
La mayoría del código Go utiliza slices y maps a diario, por lo que len, cap y las reglas de compartición son importantes.
Un array [N]T tiene el tamaño como parte del tipo.
Un slice []T es una cabecera (puntero, len, cap) sobre un array subyacente.
Un map map[K]V es una tabla hash con orden de iteración indefinido.
Los slices y maps se pasan copiando la cabecera, por lo que las mutaciones son visibles para los llamadores.
Tarjeta de referencia rápida - lista para copiar y pegar.
package main
import "fmt"
func main() {
nums := make([]int, 0, 4)
nums = append(nums, 1, 2, 3)
ages := map[string]int{"ada": 36}
ages["grace"] = 34
fmt.Println(nums, len(nums), cap(nums), ages)
}Cuándo usar esto:
make([]T, 0, n) cuando conozcas el tamaño aproximado.package main
import "fmt"
func addSuffix(names []string, suffix string) {
for i := range names {
names[i] += suffix
}
}
func main() {
original := []string{"go", "rust"}
view := original[0:2:2] // la expresión de slice completo limita la capacidad de crecimiento
addSuffix(view, "!")
counts := map[string]int{}
for _, name := range original {
counts[name]++
}
fmt.Println(original, counts)
keys := make([]string, 0, len(counts))
for k := range counts {
keys = append(keys, k)
}
fmt.Println("claves (desordenadas):", keys)
}Lo que esto demuestra:
addSuffix muta original.s[low:high:max] limita la capacidad de crecimiento de append.make o literales antes de escribir.append de slice aumenta la capacidad asignando un nuevo array cuando len == cap (típicamente duplicando).s[low:high] establece len a high-low y cap a cap(s)-low.Array [n]T | Slice []T | Map map[K]V | |
|---|---|---|---|
| Tamaño | Fijo en el tipo | Dinámico | Dinámico |
| Pasar a func | Copia el array completo | Copia la cabecera | Copia la cabecera |
| Valor cero | Todos los elementos cero | nil | nil |
| Comparable | Sí (si T es comparable) | No | No |
| Acceso por índice | a[i] | s[i] | m[k] con forma ok |
| Expresión | Significado |
|---|---|
len(s) | Número de elementos visibles en el slice |
cap(s) | Elementos desde el primer índice hasta el final del array subyacente |
make([]T, len, cap) | Asigna el array, establece len y cap |
append(s, x) | Aumenta len, puede reasignar si len == cap |
// Eliminar entrada de map
delete(m, key)
// Limpiar map en Go 1.21+
clear(m)
// Copiar slices
dst := make([]int, len(src))
copy(dst, src)a := []int{1,2,3}; b := a[:2]; append(b, 99) puede sobrescribir a[2] si la capacidad lo permite. Solución: usa slice completo a[:2:2] o append a una copia.make primero.[5]int no es []int sin hacer slice arr[:]. Solución: haz slice con [:].*[N]T o usa un slice.sync.Map o mutex.| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Slice | Colección ordenada por defecto | Necesitas búsqueda O(1) por clave |
| Map | Búsqueda por clave | Necesitas orden estable sin ordenación adicional |
| Array | Tamaño de formato de cableado fijo | Listas de propósito general |
container/list | Inserciones frecuentes en el medio (raro) | La mayoría de los casos - los slices ganan |
len es cuántos elementos puedes leer/escribir desde el índice 0.
cap es cuántos elementos existen en el array subyacente comenzando en el primer elemento del slice.
Sí - len y cap son 0, range funciona y append asigna almacenamiento subyacente.
v, ok := m[key]
if !ok { /* falta */ }No - las claves deben ser comparables; los slices, maps y funciones no son comparables.
make([]T, 0, expected) luego append, o make([]T, expected) si vas a indexar directamente.
Establece len a high-low y cap a max-low, evitando que append lea más allá de max.
Se copia el array completo.
Para buffers [1024]byte, pasa un slice buf[:] o un puntero en su lugar.
No - &m[key] es ilegal porque el almacenamiento del map puede moverse durante el crecimiento.
Almacena el valor en una variable primero si necesitas un puntero.
Itera y asigna: for k, v := range other { m[k] = v }.
Cuidado con sobrescribir claves existentes.
Puede devolver una nueva cabecera si ocurre una reasignación.
Asigna siempre: s = append(s, x).
El array es un tipo de valor [0 0 0].
El slice es una cabecera nil sin array subyacente.
append([]T(nil), s...) o s2 := make([]T, len(s)); copy(s2, s).
[]byte como slices de bytesVersiones de Stack: Esta página fue escrita para Go 1.26.x (predeterminado GC Green Tea, modernizadores go fix - verificar parche en la compilación), chi (última - verificar en la compilación), gin (última - verificar en la compilación), echo (última - verificar en la compilación), google.golang.org/grpc (última - verificar en la compilación), sigs.k8s.io/controller-runtime (última - verificar en la compilación), kubebuilder (última - verificar en la compilación), tinygo (última - verificar objetivos de placa en la compilación), wazero (última - verificar en la compilación) y golangci-lint (última - verificar conjunto de linters en la compilación).
Revisado por Chris St. John·Última actualización: 19 jul 2026