Packages vs modules

Un paquete en Go es una colección de archivos Go en un mismo directorio, que se utilizan para proporcionar una funcionalidad específica y reutilizable en una aplicación Go.

Por otro lado, un módulo en Go es una colección de paquetes Go que se utilizan juntos como una unidad lógica. Los módulos permiten especificar y gestionar las dependencias de una aplicación Go de forma más precisa y confiable. Cada módulo tiene su propio archivo go.mod que describe las dependencias y la versión de cada paquete utilizado.

Por otro lado, un módulo en Go es una colección de paquetes Go en un arbol de directorio con un fichero go.mod en el directorio principal.

Packages

Como se ha dicho, un paquete de Go es una colección de archivos en un mismo directorio. La primera línea de un archivo go se declara la pertenencia a un paquete con la sintaxis:

package <package name>

Por convención el nombre del directorio y del paquete deben ser el mismo.

Por ejemplo creamos la siguiente estructura de directorios:

mkdir webapp
cd webapp
mkdir models

Y creamos dos ficheros en el directorio models:

  • user.go
package models

import (
    "fmt"
)

type User struct {
    Name string
    Age int
}
  • chatroom.go
package models

import (
    "fmt"
)

type ChatRoom struct {
    Name string
    Users []User
}

Ambos ficheros pertenecen al mismo package: models. Otro detalle importante, es que las funciones/variables etc declaradas en un mismo paquete son visibles para todos los archivos go por defecto, no hace falta hacer import.

Como se puede observar la struct chatroom utiliza la struct User a pesar de que está definida en otro fichero.

main package

El nombre de paquete main está reservado para el punto de entrada de la aplicación y debe contener la función main que es la función de entrada de la aplicación

Modules

Crear módulos

Pasos para crear un go module

go mod init <module name>

Con el comando anterior debería haberse creado un fichero llamado go.mod que contiene todas las dependencias que utilicemos en el proyecto.

Al haber creado un módulo todos los comandos que lancemos como, go build, test, run, fmt, etc se harán sobre todos los paquetes del módulo.

Importar paquetes dentro de nuestro módulo

Para importar módulos propios tenemos que respetar obviamente las reglas para crear paquetes. Además en el import se debe poner la ruta absoluta hacia el módulo que vayamos a importar.

Para importar un paquete dentro de nuestro módulo hay que escribir el nombre que le hayamos dado al módulo seguido de la ruta hacia el paquete:

Siguiendo con el ejemplo, creemos un módulo llamado webapp:

go mod init webapp

Creamos un archivo main.go para importar los modelos creados anteriormente.

** Los imports utilizan rutas absolutas**. Siendo el origen el nombre del módulo.

package main
//Al estar en package name hay que importar los paquetes
//desados

import (
    "webapp/models" //Notar como se usa el nombre del módulo seguido de la ruta
    //hacia el paquete
)

func main() {
    user := models.User{"Foo", 25}
    chatroom := models.ChatRoom{"GoDev", nil}
}

Agregar módulos de terceros

Para agregar una dependencia con un módulo de terceros se utiliza el comando:

go get <url to module>

Y se agregaría la información de esta dependencia en el fichero go.mod

https://www.digitalocean.com/community/tutorials/how-to-use-go-modules