Saltar al contenido principal
eLearner.app
Módulo 9 · Lección 4 de 544/50 en el curso~12 min
Lecciones del módulo (4/5)

Módulos de Go

Un módulo Go es una unidad versionable compuesta por uno o más paquetes. Es la base del sistema de dependencia moderno (Go 1.11+): no más GOPATH, no más vendor obligatorio, dependencias explícitas y reproducibles.

go.mod: el manifiesto del módulo

Code
module example.com/myapp

go 1.22

require (
    github.com/google/uuid v1.6.0
    golang.org/x/time     v0.5.0
)

Tres directivas principales:

  • module <path>: la ruta de importación del módulo. Todos los paquetes internos se importan como example.com/myapp/sub/pkg. No tiene que ser una URL real, pero para publicar mediante go get debe resolverse.
  • go <version>: la versión mínima de Go requerida (también se usa para controlar qué funciones de idioma están permitidas, por ejemplo, rango sobre función en 1.23).
  • require — las dependencias directas con su versión exacta.

Otras directivas: replace (sustituye un departamento por una bifurcación o una ruta local), exclude, retract.

go.sum: el archivo de bloqueo criptográfico

Además de go.mod, go.sum contiene un hash criptográfico de CADA versión descargada (incluidas las dependencias transitivas). Garantiza reproducibilidad: si alguien altera una versión publicada, la compilación falla.

Confirmarlo siempre. Se actualiza automáticamente mediante los comandos go.

Comandos esenciales

Bash
go mod init example.com/myapp        # create go.mod
go get github.com/google/uuid        # add the dep at its latest version
go get github.com/google/uuid@v1.5.0 # specific version
go get -u ./...                      # upgrade every dep
go mod tidy                          # remove unused deps, add missing ones
go mod download                      # download everything into the cache
go mod why github.com/x/y            # explain why a dep is included
go mod graph                         # full dependency graph

go mod tidy es el que ejecuta después de cada cambio en las importaciones: garantiza que go.mod refleje exactamente los paquetes realmente utilizados.

Control de versiones de importación semántica (SIV)

Las versiones siguen SemVer: v1.2.3 = MAJOR.MINOR.PATCH. La parte interesante es principal v2+:

  • Mayor v0 y v1 → ruta normal: github.com/foo/bar.
  • v2 mayor o posterior → la ruta incluye la versión principal: github.com/foo/bar/v2.
Go
import "github.com/foo/bar/v2"

Esto le permite importar v1 y v2 de la misma biblioteca al mismo tiempo (útil durante migraciones progresivas).

Importar rutas y paquetes internos

Si su módulo es example.com/myapp, se importa una subcarpeta utils/ como:

Go
import "example.com/myapp/utils"

La ruta depende sólo del nombre declarado en go.mod, no de la ubicación en el disco: el mismo código en una carpeta diferente sigue funcionando.

Modo de espacio de trabajo (Go 1.18+)

Para trabajar en varios módulos que hacen referencia entre sí al mismo tiempo (por ejemplo, una biblioteca y una aplicación que la utiliza):

Bash
go work init ./lib ./app

Esto crea go.work: go build usará la versión local de ./lib en lugar de descargar la publicada. No confirme go.work (es un entorno de desarrollo).

Ejercicios

Ejercicio#go.m9.l4.e1
Intentos: 0Cargando...

El módulo es example.com/myapp y contiene una subcarpeta de utilidades. Importe el subpaquete en main usando la ruta completa.

Cargando editor...
Mostrar pista

La ruta de importación es el nombre del módulo (de go.mod) más la ruta relativa de la carpeta.

Solución disponible después de 3 intentos

Ejercicio#go.m9.l4.e2
Intentos: 0Cargando...

Convierta las importaciones individuales en un grupo de importación con la sintaxis de importación (...), importando tanto fmt como os.

Cargando editor...

Solución disponible después de 3 intentos

Cuestionario#go.m9.l4.e3
Listo

¿Qué comando elimina las dependencias que ya no se importan de go.mod y agrega las que faltan?

Go
$ go mod ???
Opciones de respuesta