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
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 = 4El valor cero de una matriz es una matriz de la longitud declarada con cada elemento en su valor cero:
var nums [5]int // [0 0 0 0 0]Indexación y len
a := [3]int{10, 20, 30}
fmt.Println(a[0]) // 10
a[1] = 99
fmt.Println(len(a)) // 3El 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.
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:
a := [3]int{1, 2, 3}
b := a // copy
b[0] = 99
fmt.Println(a[0]) // 1 — a is unchangedLo 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]bytepara 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
Declare a como una matriz de 3 entradas con valores 10, 20, 30 e imprima su longitud.
Mostrar pista
Literal de matriz: `[3]int{a, b, c}`.
Solución disponible después de 3 intentos
Declare b como una matriz de 5 enteros (todos cero) y asigne 99 a la posición 2.
Mostrar pista
`var b [5]int` comienza como [0 0 0 0 0].
Solución disponible después de 3 intentos
¿Son [3]int y [4]int del mismo tipo?
var a [3]int
var b [4]int
// a = b ?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.