Arrays en Go
Introducción
En este artículo, nos adentraremos en el mundo de los arrays en Go, un poderoso lenguaje de programación creado por Google.
Aprenderemos cómo declarar, inicializar, acceder y manipular arrays en Go, además de examinar operaciones comunes y técnicas avanzadas para trabajar con ellos.
Al finalizar la lectura, contarás con un profundo conocimiento sobre el uso de arrays en tus proyectos de Go.
¿Qué son los arrays en Go?
Un array en Go es una estructura de datos que contiene una cantidad fija de elementos del mismo tipo. El tipo de elementos que puede contener un array es prácticamente ilimitado, incluyendo números enteros, flotantes, cadenas de caracteres, estructuras, etc.
Los arrays son útiles cuando necesitas almacenar múltiples valores relacionados de manera ordenada y accesible.
Por ejemplo, podrías tener un array de calificaciones de estudiantes, donde cada elemento del array representa la calificación de un estudiante en particular.
Al ser de tamaño fijo, los arrays aseguran que se utilice únicamente la cantidad de memoria necesaria, optimizando así el uso de recursos.
La sintaxis para declarar un array es la siguiente:
var nombre_array [longitud]tipo
Lenguaje del código: Go (go)
Donde nombre_array
es el nombre del array, longitud
es la cantidad de elementos que puede almacenar el array y tipo
es el tipo de dato que contendrá el
Ejemplo de un array en Go:
package main
import "fmt"
func main() {
var calificaciones [5]int
calificaciones[0] = 85
calificaciones[1] = 90
calificaciones[2] = 78
calificaciones[3] = 92
calificaciones[4] = 88
fmt.Println(calificaciones)
}
Lenguaje del código: Go (go)
En este ejemplo, hemos creado un array llamado calificaciones
que contiene cinco elementos de tipo int
. Luego, asignamos valores a cada elemento y, finalmente, imprimimos el contenido del array.
Diferencia entre arrays y slices en Go
Aunque los arrays y los slices en Go pueden parecer similares a simple vista, hay diferencias clave entre ellos:
- Arrays:
- Tamaño fijo en el momento de la declaración
- Menos flexibles que los slices
- Útiles cuando se conoce el tamaño requerido previamente
- Slices:
- Tamaño dinámico y puede cambiar durante la ejecución del programa
- Más flexibles que los arrays
- Útiles cuando se desconoce el tamaño requerido previamente o cuando se espera que cambie
A continuación, se muestra un ejemplo de array y slice en Go para ilustrar las diferencias:
var arrayEjemplo [3]int // Declaración de un array de tamaño fijo con 3 elementos
arrayEjemplo[0] = 1
arrayEjemplo[1] = 2
arrayEjemplo[2] = 3
sliceEjemplo := []int{1, 2, 3} // Declaración de un slice con 3 elementos
sliceEjemplo = append(sliceEjemplo, 4) // Añade un cuarto elemento al slice
Lenguaje del código: Go (go)
Declaración e inicialización de arrays en Go
En esta sección, veremos cómo declarar e inicializar arrays en Go utilizando diferentes métodos.
Declaración de arrays con tamaño fijo
Para declarar un array en Go, se utiliza la siguiente sintaxis:
var nombreArray [tamaño]Tipo
Lenguaje del código: Go (go)
Donde “nombreArray” es el identificador del array, “tamaño” es un número entero que define la cantidad de elementos que puede contener el array, y “Tipo” es el tipo de dato que almacena el array.
Ejemplo:
var colores [3]string // Declaración de un array llamado 'colores' que puede almacenar 3 cadenas de texto
Lenguaje del código: Go (go)
Inicialización de arrays con valores predeterminados
Una vez que hayas declarado un array, puedes inicializarlo asignando valores a sus elementos. Para asignar un valor a un elemento del array, utiliza el operador de indexación ([]
).
Ejemplo:
var colores [3]string // Declaración de un array llamado 'colores' que puede almacenar 3 cadenas de texto
colores[0] = "rojo" // Asignación de valores a los elementos del array
colores[1] = "verde"
colores[2] = "azul"
Lenguaje del código: Go (go)
Declaración e inicialización en una sola línea
También puedes declarar e inicializar un array en una sola línea utilizando la siguiente sintaxis:
nombreArray := [tamaño]Tipo{valor1, valor2, ..., valorN}
Lenguaje del código: Go (go)
Ejemplo:
colores := [3]string{"rojo", "verde", "azul"} // Declaración e inicialización del array 'colores' en una sola línea
Lenguaje del código: Go (go)
Si deseas que Go infiera el tamaño del array a partir de la cantidad de elementos proporcionados, puedes utilizar la sintaxis “…” en lugar de especificar el tamaño explícitamente:
colores := [...]string{"rojo", "verde", "azul"} // Go infiere el tamaño del array 'colores' como 3
Lenguaje del código: Go (go)
En este caso, Go determina automáticamente el tamaño del array en base a la cantidad de elementos proporcionados en la inicialización.
Acceder a elementos de un array en Go
En Go, se accede a los elementos de un array mediante su índice. El índice indica la posición del elemento dentro del array, empezando por 0 para el primer elemento.
Para acceder a un elemento específico del array, se utiliza la sintaxis array[indice]
, donde array
es el nombre del array y indice
es el número entero que indica la posición del elemento que se desea acceder.
Por ejemplo, si tenemos el siguiente array de tipo int
:
var mi_array [5]int = [5]int{10, 20, 30, 40, 50}
Lenguaje del código: Go (go)
Para acceder al tercer elemento del array, que tiene un índice de 2
, se puede hacer lo siguiente:
fmt.Println(mi_array[2]) // Imprime el valor del tercer elemento del array: 30
Lenguaje del código: Go (go)
En este ejemplo, se utiliza la sintaxis mi_array[2]
para acceder al tercer elemento del array, que tiene un índice de 2
. Luego, se utiliza la función fmt.Println() para imprimir el valor del elemento.
También se pueden utilizar variables como índices para acceder a los elementos de un array. Por ejemplo, si tenemos una variable indice
de tipo int
que contiene el valor 1
, se puede acceder al segundo elemento del array de la siguiente manera:
var indice int = 1
fmt.Println(mi_array[indice]) // Imprime el valor del segundo elemento del array: 20
Lenguaje del código: Go (go)
En este ejemplo, se utiliza la variable indice
como índice para acceder al segundo elemento del array, que tiene un valor de 20
.
Es importante tener en cuenta que los índices en Go deben ser números enteros no negativos. Si se utiliza un índice fuera del rango válido del array, se producirá un error en tiempo de ejecución.
Cambiar elementos de un array en Go
En Go, se pueden cambiar los elementos de un array utilizando la sintaxis array[indice] = valor
, donde array
es el nombre del array, indice
es el número entero que indica la posición del elemento que se desea cambiar y valor
es el nuevo valor que se desea asignar al elemento.
Por ejemplo, si tenemos el siguiente array de tipo int
:
var mi_array [5]int = [5]int{10, 20, 30, 40, 50}
Lenguaje del código: Go (go)
Para cambiar el valor del tercer elemento del array, que tiene un índice de 2
, se puede hacer lo siguiente:
mi_array[2] = 35
fmt.Println(mi_array) // Imprime el array modificado: [10 20 35 40 50]
Lenguaje del código: Go (go)
En este ejemplo, se utiliza la sintaxis mi_array[2] = 35
para cambiar el valor del tercer elemento del array, que tiene un índice de 2
, a 35
. Luego, se utiliza la función fmt.Println() para imprimir el array modificado.
También se pueden utilizar variables como índices para cambiar los elementos de un array. Por ejemplo, si tenemos una variable indice
de tipo int
que contiene el valor 1
y queremos cambiar el valor del segundo elemento del array, se puede hacer lo siguiente:
var indice int = 1
mi_array[indice] = 25
fmt.Println(mi_array) // Imprime el array modificado: [10 25 30 40 50]
Lenguaje del código: Go (go)
En este ejemplo, se utiliza la variable indice
como índice para acceder al segundo elemento del array y cambiar su valor a 25
. Luego, se utiliza la función fmt.Println() para imprimir el array modificado.
Iteración sobre un array usando bucles for
Para recorrer todos los elementos de un array, puedes utilizar un bucle for
. Go proporciona dos formas de iterar sobre un array: utilizando un bucle for
con índices y utilizando un bucle for
con la declaración range.
Bucle for con índices
colores := [3]string{"rojo", "verde", "azul"} // Declaración e inicialización del array 'colores'
// Iteración sobre el array utilizando un bucle for con índices
for i := 0; i < len(colores); i++ {
fmt.Println(colores[i]) // Imprime cada elemento del array 'colores'
}
Lenguaje del código: Go (go)
Bucle for
con la declaración range
colores := [3]string{"rojo", "verde", "azul"} // Declaración e inicialización del array 'colores'
// Iteración sobre el array utilizando un bucle for con la declaración range
for i, color := range colores {
fmt.Printf("Índice: %d, Color: %s\n", i, color) // Imprime el índice y el elemento del array 'colores'
}
Lenguaje del código: Go (go)
Ten en cuenta que si solo necesitas el elemento y no el índice, puedes utilizar el operador guion bajo (_) para ignorar el valor del índice:
for _, color := range colores {
fmt.Println(color) // Imprime cada elemento del array 'colores' sin utilizar el índice
}
Lenguaje del código: Go (go)
Operaciones comunes en arrays
En esta sección, discutiremos algunas operaciones comunes que puedes realizar en arrays en Go.
Longitud de un array con la función len()
La función len()
te permite obtener la longitud (número de elementos) de un array.
Ejemplo:
numeros := [...]int{1, 2, 3, 4, 5} // Declaración e inicialización del array 'numeros'
longitud := len(numeros) // Obtiene la longitud del array 'numeros'
fmt.Println(longitud) // Imprime 5
Lenguaje del código: Go (go)
Copiar arrays con la función copy()
La función copy()
te permite copiar elementos de un array a otro. La función devuelve la cantidad de elementos copiados.
Ejemplo:
numeros1 := [5]int{1, 2, 3, 4, 5} // Declaración e inicialización del array 'numeros1'
var numeros2 [5]int // Declaración del array 'numeros2' de tamaño 5
copiados := copy(numeros2[:], numeros1[:]) // Copia elementos de 'numeros1' a 'numeros2'
fmt.Println(copiados) // Imprime 5
fmt.Println(numeros2) // Imprime [1 2 3 4 5]
Lenguaje del código: Go (go)
Encontrar el elemento máximo y mínimo en un array
Para encontrar el elemento máximo y mínimo en un array, puedes iterar sobre el array y comparar los elementos.
Ejemplo:
numeros := [...]int{5, 2, 8, 1, 4} // Declaración e inicialización del array 'numeros'
min := numeros[0] // Inicializa 'min' y 'max' con el primer elemento del array
max := numeros[0]
for _, num := range numeros {
if num < min {
min = num // Actualiza 'min' si se encuentra un valor menor
}
if num > max {
max = num // Actualiza 'max' si se encuentra un valor mayor
}
}
fmt.Printf("Mínimo: %d, Máximo: %d\n", min, max) // Imprime "Mínimo: 1, Máximo: 8"
Lenguaje del código: Go (go)
Ordenar un array en Go
Go no proporciona una función de ordenación específica para arrays, pero puedes convertir un array a un slice y utilizar el paquete “sort” para ordenar el slice.
Ejemplo:
import (
"fmt"
"sort"
)
func main() {
numeros := [...]int{5, 2, 8, 1, 4} // Declaración e inicialización del array 'numeros'
numerosSlice := numeros[:] // Convierte el array 'numeros' en un slice
sort.Ints(numerosSlice) // Ordena el slice 'numerosSlice' en orden ascendente
fmt.Println(numerosSlice) // Imprime [1 2 4 5 8]
}
Lenguaje del código: Go (go)
En esta sección, hemos explorado algunas operaciones comunes en arrays, como obtener la longitud, copiar arrays, encontrar elementos máximo y mínimo, y ordenar arrays. En la siguiente sección, aprenderemos sobre arrays multidimensionales.
Arrays multidimensionales en Go
Los arrays multidimensionales son arrays que contienen otros arrays como elementos. En Go, los arrays multidimensionales se pueden utilizar para representar estructuras de datos como matrices, tablas o rejillas.
En esta sección, aprenderemos cómo declarar, inicializar, acceder y modificar elementos en arrays multidimensionales, así como cómo iterar sobre ellos.
Declaración e inicialización de arrays multidimensionales
Para declarar un array multidimensional en Go, especifica las dimensiones del array en la declaración utilizando corchetes ([]
).
Ejemplo de declaración de un array bidimensional (matriz) de 3×3:
var matriz [3][3]int // Declaración de un array bidimensional 'matriz' con 3 filas y 3 columnas
Lenguaje del código: Go (go)
Para inicializar un array multidimensional, proporciona los valores de los elementos en un formato anidado.
Ejemplo de inicialización de un array bidimensional (matriz) de 3×3:
matriz := [3][3]int{
{1, 2, 3},
{4, 5, 6},
{7, 8, 9},
} // Inicialización del array bidimensional 'matriz' con valores
Lenguaje del código: Go (go)
Acceso y modificación de elementos en arrays multidimensionales
Para acceder o modificar un elemento en un array multidimensional, utiliza el operador de indexación ([]
) y proporciona los índices de cada dimensión.
Ejemplo de acceso y modificación de un elemento en un array bidimensional (matriz) de 3×3:
matriz := [3][3]int{
{1, 2, 3},
{4, 5, 6},
{7, 8, 9},
} // Inicialización del array bidimensional 'matriz' con valores
elemento := matriz[1][2] // Acceso al elemento en la fila 1 (segunda fila) y columna 2 (tercera columna)
fmt.Println(elemento) // Imprime 6
matriz[1][2] = 10 // Modificación del elemento en la fila 1 y columna 2
fmt.Println(matriz[1][2]) // Imprime 10
Lenguaje del código: Go (go)
Iteración sobre arrays multidimensionales
Para iterar sobre un array multidimensional, utiliza bucles for
anidados. El bucle externo recorre las filas y el bucle interno recorre las columnas (o las dimensiones adicionales, si es un array de más de dos dimensiones).
Ejemplo de iteración sobre un array bidimensional (matriz) de 3×3 utilizando bucles for
anidados:
matriz := [3][3]int{
{1, 2, 3},
{4, 5, 6},
{7, 8, 9},
} // Inicialización del array bidimensional 'matriz' con valores
// Iteración sobre el array bidimensional 'matriz' utilizando bucles for anidados
for i := 0; i < len(matriz); i++ {
for j := 0; j < len(matriz[i]); j++ {
fmt.Printf("%d ", matriz[i][j]) // Imprime cada elemento de 'matriz'
}
fmt.Println()
}
Lenguaje del código: Go (go)
Alternativamente, puedes utilizar bucles for
con la declaración range
para iterar sobre un array multidimensional:
matriz := [3][3]int{
{1, 2, 3},
{4, 5, 6},
{7, 8, 9},
} // Inicialización del array bidimensional 'matriz' con valores
// Iteración sobre el array bidimensional 'matriz' utilizando bucles for con la declaración range
for i, fila := range matriz {
for j, elemento := range fila {
fmt.Printf("Índice: [%d][%d], Valor: %d\n", i, j, elemento) // Imprime los índices y el elemento de 'matriz'
}
}
Lenguaje del código: Go (go)
Arrays multidimensionales de más de dos dimensiones
Aunque los ejemplos anteriores se centran en arrays bidimensionales (matrices), también puedes trabajar con arrays multidimensionales de más de dos dimensiones utilizando una sintaxis similar.
Ejemplo de un array tridimensional de 2x3x4:
var cubo [2][3][4]int // Declaración de un array tridimensional 'cubo' con 2 capas, 3 filas y 4 columnas
// Inicialización del array tridimensional 'cubo' con valores
cubo = [2][3][4]int{
{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
},
{
{13, 14, 15, 16},
{17, 18, 19, 20},
{21, 22, 23, 24},
},
}
// Iteración sobre el array tridimensional 'cubo' utilizando bucles for anidados
for i := 0; i < len(cubo); i++ {
for j := 0; j < len(cubo[i]); j++ {
for k := 0; k < len(cubo[i][j]); k++ {
fmt.Printf("%d ", cubo[i][j][k]) // Imprime cada elemento de 'cubo'
}
fmt.Println()
}
fmt.Println()
}
Lenguaje del código: Go (go)
Conversiones entre arrays y slices en Go
Los arrays y los slices son dos estructuras de datos fundamentales en Go. Aunque ambos son similares en muchos aspectos, también tienen diferencias importantes.
Los arrays tienen un tamaño fijo, mientras que los slices son dinámicos y pueden cambiar de tamaño. En esta sección, aprenderemos cómo convertir arrays a slices y viceversa.
Convertir un array en un slice
Para convertir un array en un slice, utiliza los dos puntos (:
) para seleccionar un rango de elementos en el array y crear un nuevo slice. Si no especificas los límites del rango, se seleccionarán todos los elementos del array.
Ejemplo:
numeros := [5]int{1, 2, 3, 4, 5} // Declaración e inicialización del array 'numeros'
numerosSlice := numeros[:] // Convierte el array 'numeros' en un slice que incluye todos los elementos
fmt.Printf("Array: %v, Slice: %v\n", numeros, numerosSlice) // Imprime "Array: [1 2 3 4 5], Slice: [1 2 3 4 5]"
Lenguaje del código: Go (go)
También puedes especificar un rango específico de elementos para incluir en el nuevo slice:
numeros := [5]int{1, 2, 3, 4, 5} // Declaración e inicialización del array 'numeros'
subSlice := numeros[1:4] // Crea un nuevo slice que incluye los elementos en los índices 1, 2 y 3
fmt.Println(subSlice) // Imprime "[2 3 4]"
Lenguaje del código: Go (go)
Convertir un slice en un array
Dado que los slices tienen un tamaño dinámico, no es posible convertir directamente un slice en un array. Sin embargo, puedes crear un nuevo array y copiar los elementos del slice en el array utilizando la función copy()
.
Ejemplo:
numerosSlice := []int{1, 2, 3, 4, 5} // Declaración e inicialización del slice 'numerosSlice'
var numeros [5]int // Declaración del array 'numeros' de tamaño 5
copiados := copy(numeros[:], numerosSlice) // Copia los elementos del slice 'numerosSlice' en el array 'numeros'
fmt.Println(copiados) // Imprime 5
fmt.Println(numeros) // Imprime "[1 2 3 4 5]"
Lenguaje del código: Go (go)
Ten en cuenta que si el tamaño del slice y el array no coinciden, se copiarán tantos elementos como sea posible sin exceder el tamaño del array de destino.
Ejemplos prácticos
A continuación, veremos algunos ejemplos prácticos que demuestran cómo utilizar arrays en Go para resolver problemas comunes.
Ejemplo 1: Suma de elementos en un array
package main
import "fmt"
func main() {
numeros := [5]int{1, 2, 3, 4, 5} // Declaración e inicialización del array 'numeros'
suma := 0 // Inicializa la variable 'suma' en 0
for _, num := range numeros {
suma += num // Suma el valor de 'num' a 'suma'
}
fmt.Println("La suma de los elementos del array es:", suma) // Imprime "La suma de los elementos del array es: 15"
}
Lenguaje del código: Go (go)
En este ejemplo, hemos creado un array numeros
que contiene cinco elementos. Luego, inicializamos una variable llamada suma con el valor de 0.
Usamos un bucle for
con la declaración range
para iterar sobre los elementos del array numeros
, y vamos sumando cada elemento a la variable suma
. Al final, imprimimos la suma de todos los elementos del array.
Ejemplo 2: Cálculo del promedio de un array de números
package main
import "fmt"
func main() {
numeros := [5]float64{1, 2, 3, 4, 5} // Declaración e inicialización del array 'numeros'
suma := 0.0 // Inicializa la variable 'suma' en 0
for _, num := range numeros {
suma += num // Suma el valor de 'num' a 'suma'
}
promedio := suma / float64(len(numeros)) // Calcula el promedio dividiendo la suma por la cantidad de elementos en el array
fmt.Printf("El promedio de los elementos del array es: %.2f\n", promedio) // Imprime "El promedio de los elementos del array es: 3.00"
}
Lenguaje del código: Go (go)
En este caso, también creamos un array numeros
con cinco elementos, pero de tipo float64
. Inicializamos la variable suma
con el valor de 0.0. Utilizamos un bucle for
con la declaración range
para iterar sobre los elementos del array numeros
y sumar cada elemento a la variable suma
.
Después del bucle, calculamos el promedio dividiendo la suma por la cantidad de elementos en el array (len(numeros)). Finalmente, imprimimos el promedio de los elementos del array.
Ejemplo 3: Búsqueda secuencial en un array
package main
import "fmt"
func main() {
numeros := [7]int{23, 42, 15, 7, 68, 32, 29} // Declaración e inicialización del array 'numeros'
valorBuscado := 68 // Valor que se busca en el array
indice := -1 // Inicializa la variable 'indice' en -1, lo que indica que el valor no se encontró
for i, num := range numeros {
if num == valorBuscado {
indice = i // Si se encuentra el valor buscado, guarda el índice en la variable 'indice'
break // Termina el bucle, ya que se encontró el valor
}
}
if indice != -1 {
fmt.Printf("El valor %d se encuentra en el índice %d del array.\n", valorBuscado, indice) // Imprime "El valor 68 se encuentra en el índice 4 del array."
} else {
fmt.Printf("El valor %d no se encuentra en el array.\n", valorBuscado) // Imprime esto si el valor no se encuentra en el array
}
}
Lenguaje del código: Go (go)
En el tercer ejemplo, creamos un array numeros
con siete elementos y especificamos un valorBuscado
que queremos encontrar en el array. Inicializamos una variable llamada indice
con el valor de -1, lo que indica que el valor buscado aún no se ha encontrado.
Usamos un bucle for
con la declaración range
para iterar sobre los elementos del array numeros
. Si encontramos el valorBuscado
, actualizamos la variable indice
con el índice del elemento encontrado y terminamos el bucle con la instrucción break.
Después del bucle, verificamos si el valor de indice
es diferente de -1, lo que indica que encontramos el valor buscado en el array. Si es así, imprimimos el índice en el que se encuentra el valor; de lo contrario, imprimimos un mensaje que indica que el valor no se encuentra en el array.
Referencias
Aquí tienes algunas referencias útiles sobre arrays en Go:
- Sitio oficial de Go – Documentación sobre arrays.
- Go by Example – Arrays.
Estas referencias cubren varios aspectos de los arrays en Go, desde la documentación oficial hasta ejemplos prácticos y tutoriales en profundidad. Al leer y estudiar estos recursos, podrás ampliar tus conocimientos sobre el tema y aprender más sobre cómo utilizar arrays en Go.