1Características principales¶
Go es un lenguaje de programación desarrollado por Google y lanzado oficialmente en 2009. Es un lenguaje compilado, es decir, una vez escrito el código fuente se debe traducir a código máquina para poder ejecutarlo; esta operación de traducción se conoce como compilación.
Logo de Go.
Los creadores de Go, Robert Griesemer, Rob Pike y Ken Thompson, han dicho que aunque la sintaxis del lenguaje está inspirada principalmente en C y en Python, y en menor medida en Java, el objetivo siempre fue crear un nuevo lenguaje simple y eficiente. Go fue diseñado para ambientes altamente productivos y concurrentes (es decir, donde varios programas se ejecutan al mismo tiempo y comparten recursos). Fue liberado como código abierto y está disponible para todos los sistemas operativos.
Go es un lenguaje fuertemente tipado y con tipado estático, es decir que al momento de compilar, debe estar claramente establecido de qué tipo son sus variables. Por lo tanto, cuando escribimos código, al declarar una variable se debe declarar de qué tipo es.
Fuertemente tipado significa que no se pueden realizar operaciones entre distintos tipos de datos que no están previamente establecidas por el lenguaje o el programador. Las conversiones entre distintos tipos se deben realizar explícitamente, por ejemplo, si queremos sumarle a un número entero un número en decimal (en punto flotante) primero debemos convertir el número en punto flotante a entero y así el resultado será otro entero.
Tipado estático significa que el tipo de una variable se determina en el momento de escribir el código y no puede cambiar durante la ejecución del programa.
1.1Gestión de memoria¶
La gestión de memoria se refiere a cómo se reserva espacio para las variables y cómo se libera ese espacio cuando ya no se necesitan dichas variables. En Go, este proceso es automático, por lo que el programador no necesita pedir ni liberar memoria explícitamente (al estilo de malloc y free en C).
Reserva de memoria: Stack vs Heap¶
Go utiliza principalmente dos áreas de memoria para almacenar datos:
Pila (Stack): Es una memoria muy rápida donde se almacenan las variables locales de las funciones y los parámetros. El espacio se reserva al declarar la variable y se libera automáticamente e instantáneamente cuando la función termina.
Montículo (Heap): Es una región de memoria más grande que se utiliza para datos que deben persistir más allá de la ejecución de una función o que tienen un tamaño dinámico (como slices o mapas), es decir que el tamaño no se conoce al momento de declarar la variable.
Para reservar memoria, el programador simplemente declara la variable; el compilador e incluso el ambiente de ejecución (runtime) se encargan de asignar el espacio necesario:
1 2var edad int // Reserva automática para un entero nombres := make([]string, 0) // Reserva dinámica para un slice
El compilador decide automáticamente dónde colocar cada variable mediante un proceso llamado análisis de escape (escape analysis). Si detecta que una variable local “escapa” de su función (por ejemplo, si se devuelve un puntero a esa variable o se guarda en una estructura global), la moverá automáticamente al heap.
Liberación de memoria: Garbage Collector¶
Para liberar la memoria reservada en el heap, Go utiliza un recolector de basura (Garbage Collector o GC). El GC se ejecuta de forma periódica realizando las siguientes tareas:
Rastreo: Identifica qué objetos en el heap ya no son accesibles desde ninguna parte activa del código.
Barrido: Libera el espacio que ocupaban esos objetos para que pueda ser reutilizado.
Este enfoque evita errores críticos como las fugas de memoria (memory leaks) —olvidar liberar la memoria que reservamos— o el acceso a punteros colgantes (dangling pointers) —intentar usar memoria que el programa ya liberó—.
Funcionamiento del Garbage Collector: rastreo y liberación de objetos inalcanzables.
Funcionamiento del Garbage Collector: rastreo y liberación de objetos inalcanzables.
En la imagen los objetos 4, 5 y 6 ya no son referenciados por ninguna variable, por lo tanto el GC los eliminará en la próxima ejecución.
1.2Orientación a objetos¶
Go no es un lenguaje orientado a objetos, es decir, no hay clases ni objetos como en Java, por ejemplo, sino que utiliza struct, a la C, lo que nos permite definir nuevos tipos de datos.
1 2 3 4type Persona struct { Nombre string Edad int }
Define una estructura de datos llamada Persona con dos campos: Nombre de tipo string y Edad de tipo int.
1 2 3var p Persona p.Nombre = "Fabián" p.Edad = 32
p es una variable de tipo Persona y podemos acceder a sus campos utilizando el operador punto (.), en este caso p.Nombre tiene el valor "Fabián" y p.Edad tiene el valor 32.
En Go no existe la herencia, pero sí existe la composición, que nos permite crear nuevos tipos de datos a partir de otros. En el capítulo Estructuras e interfaces vamos a profundizar en las estructuras y veremos cómo funciona la composición en Go.
1.3Ejemplos¶
En el repositorio taller-go encontrarán código de ejemplo para empezar a sumergirnos en Go.
El siguiente fragmento se encuentra en el archivo 01-introduccion/ejemplos/00-hola/main.go
1 2 3 4 5 6 7package main import "fmt" func main() { fmt.Println("¡Hola mundo!") }
Si ejecutamos en una terminal:
go run main.goobtendremos como resultado:
¡Hola mundo!Aquí vemos un ejemplo de una función simple que recibe dos argumentos de tipo int y devuelve un nuevo valor de tipo int.
1 2 3func sumar(a, b int) int { return a + b }
Para utilizar dicha función solo debemos invocarla por su nombre y proporcionarle los parámetros requeridos.
1fmt.Println(sumar(32, 7))
392Instalación¶
El sitio oficial de Go es https://go.dev/ de donde se puede descargar versiones listas para instalar o el código fuente para compilar e instalar. Se recomienda seguir las instrucciones. Una vez finalizado el proceso se puede verificar la correcta instalación, abriendo una terminal y ejecutando el siguiente comando:
go versionSi la instalación fue exitosa, deberíamos ver una salida como la siguiente:
go version go1.24.0 linux/amd642.1Go Playground¶
Go ofrece un servicio online llamado Playground https://go.dev/play que nos permite escribir y ejecutar fragmentos de código de forma simple y sin necesidad de instalar Go localmente.
3Ejercicios¶
Los ejercicios de este capítulo están en 01-introduccion-go/ejercicios/
del repositorio taller-go.
4Repositorio del taller de Go¶
El siguiente repositorio es el material de trabajo para este taller de Go. Está organizado por temas (intro, funciones, structs, etc.) y dentro de cada tema hay dos carpetas:
ejemplos/: programas completos y fragmentos que ilustran los conceptos explicados en el apunte. Sirven para seguir la teoría en la práctica y experimentar.ejercicios/: esqueletos de código con partes incompletas que se corresponden con los ejercicios propuestos a lo largo de este taller. La idea es que completen esos archivos como práctica.
El repositorio se crea automáticamente al aceptar la asignación en Classroom50. Una vez aceptada, tienen acceso a todo el contenido en su máquina local.
5Links útiles¶
Go Playground (entorno online para ejecutar código en Go)