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

Arrays de longitud fija

En Go, una matriz tiene una longitud fija, integrada en su tipo: [N]T. Es una primitiva que rara vez se usa directamente en el código de la aplicación; casi siempre trabajo con porciones (próxima lección), que son dinámicas vistas sobre matrices.

Aún así, comprender bien los arreglos es esencial: todo en Go está construido encima de ellos.

Declaración e inicialización

Go
var a [3]int = [3]int{10, 20, 30}
b := [3]int{1, 2, 3}            // inference with :=
c := [3]int{}                   // all zero: [0, 0, 0]
d := [...]int{1, 2, 3, 4}       // length inferred = 4

El valor cero de una matriz es una matriz de la longitud declarada con cada elemento en su valor cero:

Go
var nums [5]int  // [0 0 0 0 0]

Indexación y len

Go
a := [3]int{10, 20, 30}
fmt.Println(a[0])      // 10
a[1] = 99
fmt.Println(len(a))    // 3

El acceso fuera de alcance provoca un pánico en tiempo de ejecución (no un silencio indefinido). como en C).

La longitud es parte del tipo.

Go
var a [3]int
var b [4]int
// a = b   // ERROR: different types

[3]int y [4]int son tipos distintos, aunque ambos contienen CÓDIGOPH2. Esta es la razón por la que las matrices rara vez se pasan a funciones: tendrías que codifique la longitud en el tipo de parámetro.

Copiar por valor

A diferencia de los sectores (referencia) y los mapas (referencia), las matrices son copiadas por valor:

Go
a := [3]int{1, 2, 3}
b := a               // copy
b[0] = 99
fmt.Println(a[0])    // 1 — a is unchanged

Lo mismo se aplica al pasar a una función: la función recibe su propia copia.

¿Cuándo usar matrices?

  • Búfers de tamaño fijo conocidos en el momento de la compilación (por ejemplo, [16]byte para un MD5).
  • Claves de mapas compuestos (los cortes no son "comparables", las matrices sí lo son).
  • Rendimiento extremo (sin indirección, compatible con caché).

Para el 99% del código: utilice sectores.

Pruébalo

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

Declare a como una matriz de 3 entradas con valores 10, 20, 30 e imprima su longitud.

Cargando editor...
Mostrar pista

Literal de matriz: `[3]int{a, b, c}`.

Solución disponible después de 3 intentos

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

Declare b como una matriz de 5 enteros (todos cero) y asigne 99 a la posición 2.

Cargando editor...
Mostrar pista

`var b [5]int` comienza como [0 0 0 0 0].

Solución disponible después de 3 intentos

Cuestionario#go.m4.l1.e3
Listo

¿Son [3]int y [4]int del mismo tipo?

Go
var a [3]int
var b [4]int
// a = b ?
Opciones de respuesta

Resumen

  • [N]T: longitud fija, parte del tipo.
  • Valor cero: cada elemento en su valor cero.
  • [...]int{...} permite al compilador inferir la longitud.
  • Copiar por valor (incluidas funciones internas).
  • Fuera de rango = pánico, no indefinido.
  • En la práctica, utilice slices, que son vistas sobre matrices.