Índice del contenido

Golang: introducción al lenguaje, variables y tipos de datos

Golang: introducción al lenguaje, variables y tipos de datos

Golang, también conocido como go, es un lenguaje de programación compilado desarrollado por Google. Es un lenguaje bastante apreciado según los desarrolladores de acuerdo a las últimos encuestas de Stackoverflow (2021), como puedes apreciar en mi post de python vs go, donde también comparo lo bueno, lo malo y lo feo de este lenguaje.

Un poco sobre el lenguaje

Go o Golang es un lenguaje con una sintaxis muy parecida a la de C y con ciertas abstracciones en su sintaxis que lo vuelven un lenguaje en el que escribir código es muy sencillo, la verdad es que la sensación es de una mezcla entre C y Python.

Estamos ante un lenguaje compilado, imperativo, fuertemente centrado en la concurrencia y con tipado estático.

Aspectos geniales de go

  • El lenguaje es bastante simple Es un lenguaje con muy pocas palabras clave y pocas funcionalidades. Puedes aprenderlo en muy poco tiempo.
  • El compilador de Go es super rápido Dado que tiene pocas palabras claves y el lenguaje es bastante simple, go compila rapidísimo comparado con otros lenguajes de programación.
  • El manejo de concurrencia es sencillo Go fue diseñado como un lenguaje concurrente, crear concurrencia con las goroutines es bastante sencillo
  • Crear aplicaciones web es bastante sencillo Go incorpora en su librería estandar muchísimas utilidades para crear servidores web, por lo que incluso puedes usarlo sin usar ningún framework, para aplicaciones sencillas, y no tendrás ningún problema.

¿Por qué apesta go?

Para hacer este análisis lo más objetivo posible, a continuación, te explico algunos aspectos controversiales de go que no son vistos con buenos ojos por algunos desarrolladores.

  • Go carece de soporte para clases de manera directa. Pero no todo está perdido, porque sí cuenta con ciertas características que lo dotan de funcionalidades de la POO, tales como polimorfismo y clases, por medio de interfaces, structs y embedded values.
  • Go no cuenta con manejo de excepciones con bloques try y catch o equivalentes. Sino que los errores deben devolverse como valor de retorno en una función y se manejan comprobando que esta no sea nula (nil), por medio de bloques if. Lo anterior puede volverse bastante verboso y repetitivo.

Manejo de errores con Go con if
Este patrón es bastante recurrente en las aplicaciones y llega a ser tedioso

  • No existen argumentos por defecto en go, lo que aumenta la cantidad de código a escribir para lidiar con valores predeterminados.
  • No cuenta con manejo manual de memoria, go usa un garbage collector, lo cual simplifica el manejo de memoria enormemente, pero limita la administración más granular de memoria, esta fue una de las razones por las cuales discord migró de Go a Rust.
  • Go no cuenta con generics Go ya cuenta con soporte para generics desde su version 1.18.

Go y las buenas prácticas

Go está fuertemente orientado a las buenas prácticas de código. ¿Cómo lo hace? El compilador fuerza buenas prácticas en el código, impidiendo que el código compile si hay variables o importaciones que no se usan, o si no se respetan las reglas de la privacidad de nuestras propiedades y funciones, entre otras.

Error de compilación en go por variables sin usar
La compilación no se permite si hay variables sin usar.

Gopher: Una mascota genial

La mascota oficial es una ardilla de tierra y es muy común entre la comunidad usarla para ilustrar el contenido relacionado con go. Este Sartre en versión roedor azul es tan popular entre los desarrolladores que existen herramientas, como Gopherizme, para crear avatares personalizados. El impacto de la mascota es tal, que muchos desarrolladores la usan a manera de logo, aunque el logo oficial de go ya ha sido definido.

Mascota y logo de go
A la izquierda la mascota de Go. A la derecha el logo oficial

Instalación

Go se encuentra en la mayoría de los repositorios de las distribuciones de GNU/Linux. En debian y ubuntu se instala usando el comando apt install como cualquier otro paquete.

sudo apt install golang

Las instrucciones de instalación para Freebsd, windows y macosx serán diferentes.

Estructura de un archivo de go

Los archivos de go se estructuran de la siguiente manera y en este orden:

Nombre del paquete

Una sección donde se declara el nombre del paquete después de la palabra package. El nombre del paquete nos servirá para hacer importaciones de nuestros modulos.

package main

Importaciones

Una sección donde se importan todos los paquetes de go que se usarán. Para ello usamos la palabra import.

import “fmt”

Múltiples importaciones pueden colocarse dentro de paréntesis, sin comas.

import (
    "strconv"
    "fmt"
)

Contenido

El contenido del archivo, es decir declaraciones de variables, types, funciones, constantes, etc.

func main() {
    fmt.Println("Hello world!")
}

El paquete main

Go requiere de un paquete principal llamado main, que se especificará colocando package main al principio de nuestro código fuente.

package main

La función main

La función main es el punto de partida de un archivo de go, como lo sería en C, y no retorna nada.

package main

import "fmt"

func main() {
    fmt.Println("Ejecutando el programa")
}

Función init

Antes del punto de entrada del programa (la función main) se ejecuta una función init, esta puede contener todas las inicializaciones necesarias para la ejecución del programa.

package main

import "fmt"

func init() {
    fmt.Println("Inicializando el programa principal")
}

func main() {
    fmt.Println("Ejecutando el programa")
}

Compilar y ejecutar un archivo de go

Dado que go es un lenguaje compilado, requiere la compilación del código antes de poder ejecutar el código. El compilado se realiza con el comando build.

go build src/main.go

Tras el compilado tendremos un archivo que podremos ejecutar.

./main

También es posible compilar y correr el código en un solo paso usando run en lugar de go.

go run src/main.go

Diferencias entre run y build

La diferencia entre build y run radica en que run compila el código y lo ejecuta desde un directorio temporal, y posteriormente limpia los archivos generados. Si agregamos el flag –work, podremos ver la ubicación de este directorio.

go run --work src/main.go
# WORK=/tmp/go-build983014220

Tipos primitivos de datos

Dado que estamos tratando con un lenguaje compilado, necesitamos decirle al compilador el tipo de dato que usaremos para cada variable o constante.

Los valores primitivos de Go son los siguientes.

Entero

Para valores enteros con o sin signo.

  • int, se asigna de acuerdo al SO (32 o 64 bits)
  • int8,
  • int16
  • int32
  • int64

Entero sin signo

Para valores sin signo, es decir, positivos.

  • uint, se asigna de acuerdo al SO (32 o 64 bits)
  • uint8
  • uint16
  • uint32
  • uint64

Decimal

Para números decimales

  • float32
  • float64

Textos

Para textos existe únicamente string

Boolean

Para valores true or false

Números complejos

Permite manejar números reales e imaginarios:

  • Complex64
  • Complex128

Por ejemplo: c:=100+2i

Variables, constantes y zero values en go

Variables

Go permite definir variables especificando el tipo de dato y la keyword var. Es como si a una declaración de variable de Javascript le agregaras el tipo de dato.

var gravedad int8

La asignación de variables puede realizarse en un solo paso de la siguiente manera:

var gravedad int = 123

También es posible dejar que el compilador intuya el tipo de dato con el operador walrus (marmota). Este tipo de asignación solo es posible dentro del scope de una función.

gravedad := 123

En go no puedes asignar una variable al valor nulo; nil.

var gravedad = nil // error

Constantes

Con las constantes funciona de manera similar, pero se caracterizan porque no pueden modificarse. Se usa la keyword const.

Es necesario asignar un valor a una constante al momento de declararla.

const gravedad int8 = 123

Si no especificamos un tipo de constante el compilador intentará intuirlo.

const pi = 3.14159

Zero values

En go, si no asignamos un valor el compilador usará valores predeterminados para cada tipo de dato.

  • int: 0
  • float: 0
  • string: "
  • bool: false

Valor nulo

Go usa la palabra reservada nil para referirse a un valor nulo.

Comentarios

Los comentarios se marcan usando dos diagonales seguidas

// Este es un comentario en go

Los comentarios multilinea se realizan con una diagonal seguida de asterisco

/*
Este es un comentario multilinea
*/

Operadores en go

Los operadores de go son similares al resto de los lenguajes.

  • +, suma
  • -, resta
  • *, multiplicación
  • /, división
  • <, menor que
  • <=, menor o igual que
  • >, mayor que
  • >=, mayor o igual que
  • %, el módulo o residuo
  • !=, inequivalencia
  • ==, igualdad
  • !, negación
  • &&, operador AND
  • ||, operador OR
  • ++, incremental
  • --, decremental

Con esto termino la parte más básica del lenguaje, en las siguiente entrada voy a hablar de funciones y el paquete fmt en go, y en una entrada futura de otros aspectos tales como runes, array, slices en go y otras características del lenguaje.

Otros posts recomendados