Índice del contenido

Go: importación de paquetes y manejo de modulos

Go: importación de paquetes y manejo de modulos

En go puedes considerar un paquete como todos los archivos que contenga un directorio y un modulo como una colección de paquetes. Para usar el código de un paquete necesitamos importarlo, sin embargo, en Go no existen las importaciones de módulos relativas. Antes de Go 1.8, para importar paquetes (no había modulos) era necesario usar la ruta absoluta, considerando como base la ruta a la que apuntaba la variable de entorno $GOPATH o. A partir de Go 1.11, la manera más sencilla de trabajar con paquetes es usar go mod. Te explicaré esta última.

Diferencias entre modulos y paquetes en go

Diferencia entre modulos y paquetes en go

Definir el nombre de un paquete en Go

Antes de empezar, ¿recuerdas que te comenté en la introducción al lenguaje de programación Go, que el nombre de cada paquete se establece al principio de cada archivo, colocándolo después de la palabra reservada package?

Para este ejemplo el nombre del paquete será videogame.

Una vez definido, crearé un modelo o struct en videogame.go.

//videogame/videogame.go
package videogame

type Videogame struct {
    Id          int32
    Title       string
}

Recuerda que las reglas de privacidad de los structs dicen que para que podamos acceder a un struct o sus propiedades, desde otro paquete a donde fue declarado, debemos usar mayúsculas.

Una vez creado terminaremos con una structura similar a esta

Estructura de archivos del proyecto, una carpeta llamada videogame, con un archivo del mismo nombre en el interior.

Localización del archivo principal y nuestro modulo en go

Importar paquetes con go.mod

¿Para que sirve un archivo go.mod?

Un archivo de go.mod define un modulo y nos permite establecer el directorio que usaremos como base para importar los paquetes.

Archivo go.mod en la raiz del proyecto

Archivo go.mod que contiene el nombre del modulo

En el ejemplo de arriba el archivo go.mod nos permitirá tratar a la ruta videogame como un paquete e importar código desde la ruta mimodulo/videogame

¿Qué contiene un archivo go.mod?

El archivo básico de go.mod es muy corto, dentro de este solo se especifica el nombre del modulo, el cual usaremos para realizar las importaciones, y la versión de go. Es todo.

module mimodulo

go 1.15

Crear un archivo go.mod

El comando go mod init, seguido del nombre que tomará como la ruta base para nuestro paquete, creará un archivo de nombre go.mod en el directorio donde lo ejecutemos.

go mod init mimodulo

Por ejemplo, si le pasamos como nombre mimodulo, todas las carpetas que estén al mismo nivel que el archivo go.mod y que declaren un package al inicio de su archivo, se considerarán paquetes.

Múltiples directorios para importar como paquetes con go.mod

Y podremos importarlos directo desde nuestro archivo main.go

import (
	"mimodulo/foobar"
	"mimodulo/videogame"
)

Modulos remotos en Go

El manejador de modulos de go

Go tiene un manejador de modulos equivalente a pip y npm, python y javascript, respectivamente, llamado get.

go get

Para obtener modulos remotos ejecutamos el comando go get en consola seguido de la ruta de nuestro paquete; soporta cualquier repositorio, no solo github. Desde la versión de go 1.18, go get no compila el código que descarga, sino que se limita a agregar, actualizar o remover dependencias en el archivo go.mod.

go get github.com/labstack/echo

Tras la ejecución del comando, go descargará los archivos en la ruta a donde apunte la variable de entorno $GOPATH y realizará las importaciones correspondientes en tu archivo go.mod.

module mipaquete

go 1.15

require (
	github.com/labstack/echo v3.3.10+incompatible // indirect
	github.com/labstack/gommon v0.3.1 // indirect
)

Podrás notar que sus paquetes estarán disponibles para que los importemos con su respectiva ruta.

import "github.com/labstack/echo"

En caso de que necesitemos una versión en específico la declaramos después de la ruta.

go get github.com/labstack/echo/v4

go install

Por otro lado, go install no descarga código, sino que compila un modulo e instala el binario en $GOPATH/bin, ignorando el contenido del archivo go.mod cuando se le especifica una versión a través de la linea de comandos.

go install sigs.k8s.io/[email protected]

Go install generalmente se usará para instalar comandos.

Importar paquetes remotos en go

Los paquetes que se encuentran en repositorios de código, como GitHub, GitLab o BitBucket, requieren que especifiquemos la ruta completa del repositorio como su ruta de importación.

go mod init github.com/usuario/paquete

Importar paquetes sin usarlos

Hay ocasiones en donde querremos importar paquetes y no usarlos. Para esto basta con agregar un guión bajo antes de la importación.

import (
  _ "fmt"
)

Alias al importar paquetes

Go también nos permite declarar un alias a la hora de importar un paquete anteponiendo el alias a la ruta de importación.

import nuestroAlias "ruta/a/paquete"

De esa manera podemos tratar nuestro alias como si se tratara del nombre del paquete que estamos importando.

import nuestroAlias "mipaquete/videogame"
// ... nuestroAlias reemplaza a videogame
var vd = nuestroAlias.Videogame{Id: 1, Title: "hola"}

Importaciones con punto

Go permite acceder al contenido del paquete de manera directa si importamos usando como alias un punto. De esta manera podemos ignorar el nombre del paquete y acceder directamente a los objetos que contiene.

import . "mipaquete/videogame"
// ... en lugar de videogame.Videogame podemos usar solo Videogame
var vd = Videogame{Id: 1, Title: "hola"}

Librerías en Go

Si estás buscando librerías que aceleren el desarrollo de algún proyecto, existe un directorio de frameworks, librerías y utilidades en Awesome go, hay recursos para todo, desde GUI, ORMs, web frameworks, machine learning y todo lo que te puedas imaginar.

Otros recursos

Eduardo Zepeda picture
Desarrollador web y entusiasta de GNU/Linux. En este perfil se ama a Python, Javascript/Typescript y el polémico Go (Actualmente estoy aprendiendo Rust). También creemos en las bondades de la criptografía fuera de la especulación monetaria.
Leer más