Implementando nuestro primer módulo en Go

Clase 41 de 42Curso Práctico de Go: Creación de un Servidor Web

Contenido del curso

Construyendo un Servidor Web

Resumen

Reutilizar código entre proyectos es una de las prácticas más valiosas en el desarrollo profesional con Go. Gracias a los Go modules, puedes importar paquetes desde repositorios remotos, controlar versiones y asegurar que cada dependencia sea exactamente la esperada. Aquí se explica paso a paso cómo implementar un módulo previamente creado y publicado en GitHub, y cómo Go gestiona la visibilidad de funciones y variables entre paquetes.

¿Cómo se implementa un módulo de Go desde otro proyecto?

El punto de partida es crear una carpeta nueva con un archivo main.go que contenga el package main y la función main. Este será el proyecto que consume el módulo publicado previamente [0:06].

Para que este proyecto pueda instalar dependencias, necesita su propio módulo. Se inicializa con el comando:

bash go mod init platzi/go/courser

En el mundo profesional, prácticamente todo lo que escribes en Go debe ser un módulo. Esto te permite mantener dependencias con versiones controladas y exportar tus propios paquetes [0:28].

Dentro del archivo go.mod generado, se declara la dependencia con la palabra require, indicando la ruta del repositorio y la versión exacta:

go require github.com/tu-usuario/mycalculator v1.0.0

Al ejecutar go run main.go, Go descarga la dependencia y genera un archivo llamado go.sum [1:14]. Este archivo contiene un valor conocido como checksum: una cadena hexadecimal que garantiza la integridad de la descarga. Si algo falla o la versión descargada no coincide, el checksum será diferente y el error se detectará de inmediato.

¿Por qué las funciones no se autocompletaban al importar el paquete?

Al intentar usar el paquete importado, las funciones no aparecían disponibles. Esto ocurre porque Go controla la visibilidad pública y privada según la primera letra del nombre [2:08].

  • Si una función, variable o struct comienza con letra mayúscula, es pública y puede usarse desde otros paquetes.
  • Si comienza con letra minúscula, es privada y solo accesible dentro del mismo paquete.

Por ejemplo, la función leerEntrada estaba definida con l minúscula, lo que la hacía inaccesible desde el proyecto consumidor. Al cambiarla a LeerEntrada, se volvió pública [2:24].

Este mismo principio aplica a los structs. El struct calc no podía instanciarse desde fuera porque su nombre iniciaba en minúscula. Tras renombrarlo a Calc, junto con el método Operate, ambos quedaron disponibles para uso externo [3:36].

¿Cuándo dejar algo privado y cuándo hacerlo público?

La función parsear se mantuvo con letra minúscula de forma intencional. Solo se usa internamente dentro del paquete, ningún proyecto externo necesita conocerla ni invocarla. En cambio, LeerEntrada debe ser pública porque cualquier proyecto que implemente la calculadora la necesita [3:56].

Esta convención es una de las decisiones de diseño más importantes en Go:

  • Público (mayúscula): funciones y tipos que forman la interfaz del módulo.
  • Privado (minúscula): lógica interna que no debe exponerse.

¿Cómo se versiona correctamente un módulo con git tags?

Cada vez que se modifica el código del módulo, es necesario crear un nuevo tag en Git para reflejar la nueva versión [2:50]. El flujo es:

  1. Realizar los cambios y hacer commit.
  2. Crear el tag con git tag v1.0.1.
  3. Subir el tag con git push --tags.
  4. En el proyecto consumidor, actualizar la versión en go.mod.
  5. Ejecutar go run main.go para que Go descargue la versión actualizada.

Al correr el proyecto final con la versión v1.0.4, se comprueba que todo funciona: se lee la entrada, se define el operador y se obtiene el resultado esperado [5:10].

go entrada := mycalculator.LeerEntrada() operador := mycalculator.LeerEntrada() c := mycalculator.Calc{} fmt.Println(c.Operate(entrada, operador))

El resultado de 2 + 2 devuelve 4, confirmando que el módulo remoto funciona correctamente desde un proyecto independiente [5:30].

Los Go modules permiten reutilizar código propio o de terceros, manejar dependencias de forma ordenada y versionar con precisión. Si ya experimentaste con tu primer módulo, comparte en los comentarios qué funcionalidad decidiste exportar y cuál mantuviste privada.