STAGE 03. READY?!
Continuamos con la contienda. Ahora es el turno de aprender sobre las variables de Go. ¿Qué sería de un lenguaje de programación sin variables?… Exacto, por eso ahora continuamos con uno más de los pilares de nuestro conocimiento sobre Go.
GO!… LANG?
Hasta este momento deberías conocer al menos un significado aproximado de lo que es una variable. Si no es así, no te preocupes, basta con asimilar que una variable es un valor dentro de nuestro programa que cambia dependiendo de diversos factores para beneficio del programador (fun fact: si existen errores de sintaxis, hasta podrían modificarse para perjuicio del programador). Una variable tiene asignado un espacio en memoria en el que se almacena la información que ésta contiene. Mientras algunos lenguajes como C se han distinguido por su tipado tan estricto; otros lenguajes como Python son altamente reconocidos por su sencillez ya que las variables pueden declararse de cualquier tipo válido y cambiarlo durante la ejecución. Go es similar a C; necesita que todas las variables sean declaradas ya sea con tipo estático o tipo dinámico.
Declaración de variables
Todas las variables en Go tienen un tipo por el cual rigen su valor y su representación. La gran diferencia con otros lenguajes de programación como C, es que Go permite la declaración de variables con un tipo dependiente del tipo de dato de otra variable (esto es conocido como tipo dinámico o inferencia de tipo).
Una declaración en Go sigue el siguiente formato:
var variables tipos_de_dato(opcional)
En código tenemos que:
package main func main(){ var variable1, variable2, variable3 int var variable4 float }
Declaración de una sola variable tipo int (entero):
var x int
Declaración de tres variables tipo int (entero):
var x, y, z int
La inicialización de variables puede ocurrir durante cualquier parte de la ejecución del programa o durante la declaración.
Inicialización posterior de variables:
var x int x = 3
Inicialización durante declaración de variables:
var x = 3
* Nótese que ahora no es necesario especificar el tipo de la variable cuando se inicializa en el momento. Sin embargo, si quisiera hacerse una declaración de tipo por convencionalismo, se puede:
var x int = 3
Si lo que se desea es inicializar más de una variable durante la declaración:
var x, y, z = 3, 4.0 ,"Hola"
Lo anterior es igual a escribir:
var x = 3 var y = 4.0 var z = "Hola"
¿Por qué se han mezclado enteros, flotantes y cadenas? La razón es muy gratificante: porque al inicializar las variables durante su declaración, pueden asignarse diferentes tipos de valores siempre y cuando no se anteponga un tipo de dato trunco… vamos, que no se haga esto:
var x, y, z int = 2, "Hola", 3.4
¿Qué sucede? Sencillo, desde que se antepone un tipo de dato a la inicialización, se le está especificando al compilador que las variables la línea serán tratadas como enteros (int). Una vez que se intenta inicializar y con «Hola» ocurre un error con el tipo de datos puesto que y es un entero y «Hola» es una cadena de caracteres.
Digamos que necesitamos una variable X con el mismo tipo de dato de una ya existente Y, pero por alguna razón no sabemos el tipo de dato de la variable Y, o en su defecto X puede tomar el tipo de dato de Y o de Z dependiendo del comportamiento del algoritmo. Para casos similares donde nuestras variables nuevas pueden ser de un tipo de dato no conocido, tenemos el tipo dinámico de Go:
var x = "Hola a todo el mundo" y:= x
En la primera línea tenemos una declaración de una variable tipo cadena. En la segunda línea es donde podemos identificar una variable con tipo dinámico: y toma el valor de x, sea cual este sea (por obvias razones también toma el tipo de dato). La inicializaciones con tipo dinámico solamente son posibles con nuevas variables como en el ejemplo anterior donde y no había sido declarada antes. No es posible cambiar el tipo de dato de una variable a la que ya se le ha asignado un tipo de dato anteriormente. Las siguientes líneas provocarían un error al momento de compilar:
var y, z = 5, “Cadena” /*¡Error! La palabra reservada 'var no se utiliza con tipos dinámicos*/ var x:=y /*¡Error!, 'z' ya tiene un tipo de dato, no se puede asignar un tipo nuevo*/ z:=y
Tipo de dato en ejecución
Gracias al tipo dinámico podría llegar a ser complicado identificar el tipo de dato de una variable, principalmente cuando hablamos de proyectos muy grandes. Go incluye dentro de su biblioteca fmt varias funciones de impresión, entre ellas una que nos brinda la opción de conocer el tipo de dato de las variables en ejecución:
var x = 3 y:= x fmt.Println(x) fmt.Printf("Tipo de dato: %T\n",y)
Printf nos permite imprimir en pantalla texto con el formato que el programador especifique, a diferencia de Println que imprime texto con un formato por defecto. %T es el especificador de formato, en este caso señala que lo que se imprimirá será el tipo de dato de la variable después de la coma. Printf es el equivalente a printf de C.
Las líneas anteriores producen la siguiente salida:
Finalizando…
En este capítulo hemos estudiado la declaración e inicialización de variables dentro de Go. Como podemos identificar, a pesar de que el tipo dinámico puede llegar a ser muy útil, realmente el tipado estático de Go continúa casi tan estricto como en C. ¿Qué tan útil es el tipo dinámico? Depende del programador y de los proyectos en los que se utilice, pero sin lugar a dudas es una herramienta con mucho potencial. Sin más que agregar me despido.