04. Go to go: constantes

Publicado por

As Constant As The Stars

En el capítulo anterior se estudió la declaración e inicialización de variables, pero muchas veces necesitamos manejar valores que ya conocemos antes de la ejecución de nuestro programa. En este capítulo se estudiarán las constantes en Go.

¡As The Stars, As The Stars! ¡Comenzamos!

Go es un lenguaje de tipado estático que no permite las operaciones entre variables de diferentes tipos. No podemos sumar un int a un float, e incluso no se permite sumar un int a un int32 ya que, por naturaleza, son tipos de datos distintos (aunque sean similares).

En C y otros lenguajes de programación, se permiten operaciones entre diferentes tipos de datos gracias a las conversiones aritméticas automáticas. A veces esas operaciones suelen pasar desapercibidas para los programadores, como aquellas entre unsigned y signed, long y short etc. Pero se han llegado a identificar algunos problemas de compatibilidad y errores de truncamiento ocasionados por dicha “flexibilidad” que permite mezclar diferentes tipos de datos.

Desde hace mucho tiempo C incluye reglas de conversiones aritméticas que han cambiado a lo largo de sus ciclos de vida para adaptarse a lo que necesitan los programadores. En Go, por el contrario, desde el principio los desarrolladores optaron por prohibir mezclar diferentes tipos de datos; así pues si quieres sumar x y y, ambos deben de ser del mismo tipo o, en su defecto, especificar de qué tipo será el resultado. Aunque pareciera un poco complicado al principio, realmente es una buena costumbre que no está de más adoptar (¿Ya mencioné que nuestro código se vuelve más legible?).

Contantes en GO

Las constantes en Go, como en otros lenguajes de programación, son valores escalares que no pueden cambiar el valor que almacenan. La palabra reservada const es la que se utiliza para declarar constantes en Go. Una constante puede ser construida por el usuario directamente, por una expresión (sumas, restas etc.), o por funciones.

Existen constantes de todos los tipos, desde enteros y flotantes, hasta cadenas de texto. Utilizaremos una constante entera para comenzar. Supongamos que tenemos el siguiente número entero:

42

¿Qué tipo de dato tiene ese entero? ¿Entero (int)?
¿La pregunta contiene la respuesta? ¿Seguro?
¿Podrá tratarse de una constante?…

Decir que es un entero lleva algo de razón, sin embargo no es la respuesta correcta. Sí es una constante aunque no tiene ningún tipo asignado, es solamente un entero constante sin tipo (untyped int constant). Si deseamos asignar un nombre al entero anterior utilizamos const:

const numerito = 42

¿De qué tipo es numerito? … Efectivamente, no deja de ser un entero constante sin tipo (untyped int constant). La característica principal de una constante sin tipo es que, por naturaleza, no debe de seguir ninguna regla estricta para prevenir la combinación de tipos. Son las constantes sin tipo las que permiten utilizar valores (casi) libremente en Go.

Vale la pena señalar que una constante puede tener un tipo asignado:

const variable int = 42

Tenemos una constante de tipo entero que va a ser regida por todas las reglas de combinación y rango que rigen a un entero.

Como se comentaba en el capítulo anterior, una variable puede tomar un tipo de dato dinámicamente al utilizar := la primera vez que se utiliza dicha variable. Una variable también puede tomar el tipo de dato de una constante:

const numerito int = 42

var m int

m = numerito

fmt.Println("m: ", m)

j:= numerito

j = j + 1

fmt.Println("j: ", j)

Imagen 01: Salida de ejemplo anterior.
Imagen 01: Salida de ejemplo anterior.

La razón por la que j del ejemplo anterior puede aumentar su valor a pesar de haber sido inicializada por tipo dinámico a const int, es porque una variable cuyo tipo es asignado dinámicamente no puede tomar propiedades constantes, es decir, se inicializó solamente como int.

Tipo por defecto

Una constante puede no tener un tipo de dato asignado (untyped), sin embargo nos es posible realizar diferentes acciones con ella a tal punto que pareciera que en realidad sí lo tiene. Toda constante sin tipo tiene un tipo de dato implícito asignado, el cual es transferido al valor cuando se necesita realizar alguna acción que requiera un tipo de dato.

El tipo por defecto nos dice que una línea de código como ésta:

cadena:= "Ésta es una cadena"

O como ésta:

var cadena = "Esta es una cadena"

Realizan lo mismo que una línea como ésta:

var cadena string = "Esta es una cadena"

¿Cuál fue la utilidad de este capítulo?

La finalidad principal de este capítulo, además de enseñar sobre el manejo de constantes en GO; es informar a los lectores que la facilidad de otros lenguajes de programación para permitir realizar operaciones entre diferentes tipos de dato, no se encuentra en Go. Los problemas con tipos de datos pueden ser un tema común entre las personas que recién se inician en Go ya que tenemos que éste es un lenguaje de programación muy estricto con sus variables. El siguiente es un ejemplo de un error ocasionado por intentar realizar operaciones entre diferentes tipos de datos:

Imagen 02: Código fuente.
Imagen 02: Código fuente.
Imagen 03: Salida de código fuente de Imagen 02.
Imagen 03: Salida de código fuente de Imagen 02.

Si utilizamos constantes podemos realizar la operación del ejemplo anterior como se muestra a continuación:

01 04 04
Imagen 04: Código fuente de la Imagen 02 corregido.
Imagen 05: Salida del código fuente de la Imagen 04.
Imagen 05: Salida del código fuente de la Imagen 04.

En el código fuente corregido hay otros cambios además del uso de constantes, eso porque en el primer ejemplo se inicializó c pero no se utilizó en ningún lugar. Go previene las declaraciones o inicializaciones que no se utilizan. Para lograr ejecutar el ejemplo anterior se debe de utilizar la variable c (al menos imprimirla en terminal).

Más adelante se estudiarán las conversiones de tipos de dato, un tema que facilitará programar algoritmos con muchas variables numéricas que interactúan entre sí pero no pueden ser constantes.

Finalizando…

En este capítulo hemos estudiado las constantes en Go. Aprendimos que una constante puede tener (o no tener) un tipo de dato asignado, que existe un tipo por defecto, las constantes permiten las operaciones entre distintos tipos libremente y gracias a lo estricto que es Go con sus tipos de datos, se pueden evitar algunos de los errores y problemas que lenguajes como C traen consigo desde hace años.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *