De PHP a GO Capitulo 3 - Arreglos y otras cosas!

De PHP a GO Capitulo 3 - Arreglos y otras cosas!

Capitulo Anterior: De PHP a GO Capitulo 2 - "Objetos"

El universo esta hecho de Arrays, después de el Hidrogeno los arreglos son el elemento mas abundante a donde quieras que mires.

Regresando a nuestro amando PHP donde los arreglos se definen con abundancia, soportando todo tipo de datos y en cantidades escandalosas, no nos viene mal aprender un poco de mesura y austeridad.

Y es que GO es ese padre que nos reprende en pro de disciplinarnos pero luego se apiada de nosotros y nos da formas mas sencillas de hacer las cosas.

Arrays

Como ya lo sospecharas, los arrays tiene un tamaño y un tipo definido, esto hace que se reserve en memoria solo una vez.

var names [3]string

Si no le asignamos un valor a la hora de definir un array todos sus elementos se inician el 0 en caso de ser numéricos, "" para string y false para booleanos.

Pero GO sabe de nuestro turbio pasado y que a lo mejor ponernos a contar cuantos elementos tiene nuestro arreglo hará que abandonemos todo, así que nos permite definirlo de una manera en la que él cuenta los elementos por nosotros (vagos!!).

names := [...]string{"esto", "es","el","colmo!"}

Pero no os emocionéis, siguen siendo inmutables!

Algo curioso con lo que nos podemos encontrar a la hora de crear arreglos con elemento de tipo String con mas de una palabra es que a la hora de imprimirlos no sabemos donde comienza o termina cada elemento.

names := [3]string{"Miguel Angel", "Picasso","Vincent van Gogh"}
fmt.Println(names)
[Miguel Angel Picasso Vincent van Gogh]

Esto se soluciona fácilmente haciendo una impresión con formato quote

fmt.Printf("%q", names)

Aqui las diferentes opciones de formato fmt

Slices

Y aquí viene nuestro padre bondadoso luego de vernos luchar infructuosamente con nuestra falta de detenimiento a pensar que a lo mejor los elementos que estamos almacenando no van a cambiar de tamaño.

Y es que los Slices nos permiten tener arreglos dinámicos en relación a su tamaño.

Pero antes de tomar la magia y hacernos fanáticos ciegamente, viene bien saber que los Slices son una envoltura de los arreglos y realmente no almacenan nuestros datos si no que hacen referencia a un Array.

Cuando nosotros cortamos un Array lo que estamos generando es un Slice (de ahí su definición) un arreglo lo podemos cortar de la siguiente manera.

numbers := [5]int{1,2,3,4,5}
sliceFromNumbers := numbers[0:3]

Para definir un Slice sin hacer un corte basta con que NO definamos el numero de elementos a contener.

names := []string{"Miguel Angel", "Picasso","Vincent van Gogh"}
names = append(names, "Salvador Dali")

Una buena practica es usar make de esa manera se puede iniciar un numero de elementos y/o definir el tamaño del Slice.

numbers := make([]int, 6, 18)

Y como no todo puede ser paz y armonía, una vez has agregado elementos a un Slice te preguntas instintivamente, ¿como se eliminan?, estarás confiando de que habrá algún método para hacerlo de manera simple y elegante, pero... No!!

Para quitar un elemento, se debe cortar los elementos antes de ese elemento, cortar los elementos después de ese elemento y a continuación, anexar estos dos nuevos Slices juntos sin el elemento que se desea quitar.

Asi como leiste! yo lo he apuntado en un papel para meditarlo cuando la vida se me complica y de alguna forma me da esperanza de que mis problemas cotidianos son mas triviales.

Si deseamos eliminar el elemento con indexe 2 lo que debemos hacer es lo siguiente.

names = append(names[:2], names[3:]...)

Si estas pensando hacer una función de borrado no os lo recomiendo, (yo también lo pensé) ya que tendrás que hacer una por cada tipo, solo déjalo ir, luego de un rato ya ni notas su extraña forma.

Maps

En GO también tenemos los arreglos asociativos de los que tanto hacemos uso en PHP solo que debemos de tener en cuenta que las claves y los valores solo pueden ser de un tipo cada una.

record := map[string]string{"status": "open", "type": "red"}

Y se puede acceder, modificar o agregar elementos de la mimas forma que los hacemos en PHP.

// Add
record["newKey"] = "newValue"

// Modify
record["status"] = "close"

//Use 
fmt.Println(record["type"])

Y para eliminar lo bueno es que ya estas preparado para formas únicas y novedosas de borrar elementos.

delete(record, "type")

Jajajajaja! inesperado!! GO es una montaña rusa de emociones!