Organización del código
Paquetes
Todos los programas de Go deben tener un paquete main
que contenga una func main() {}
, de
lo contrario Go no puede determinar cual es el punto inicial del proyecto.
Un paquete es una colección de código fuente en un mismo directorio que se compilan juntos.
Funciones, tipos, variables y constantes definidas en distintos archivos de código fuente en
un directorio están disponibles para todos los archivos en el mismo directorio y que componen
el mismo paquete. Todos los programas escritos en Go están compuestos por paquetes. Existen
dos "tipos" de paquetes: paquetes que ya están incluidos en la librería estandar de Go y paquetes
creados por usuarios, puede ser por nosotros mismos u otras personas. Para definir un paquete
tenemos que usar:
// archivo testPackage.go (puede tener cualquier nombre) dentro del directorio testPackage
package testPackage
Módulos
Un módulo es una colección de paquetes de Go que se relacionan entre si. Un repositorio de Go
tipicamente contiene un solo módulo, localizado en el directorio raíz del proyecto. Un
archivo llamado go.mod
en el directorio raíz declara la dirección del módulo; el prefijo que
usamos para importar todos los paquetes de ese módulo. Por ejemplo, para inicializar un módulo
podemos hacer lo siguiente en la carpeta raíz:
// en la linea de comandos apuntando al directorio raíz de nuestro proyecto
cd testModule
go mod init github.com/Jesusz0r/testModule
Esto inicializará un módulo cuya dirección es github.com/Jesusz0r/testModule
. Hay que tener en
cuenta que no hace falta publicar nuestro código en github (en este caso) para poder hacer uso de
esta funcionalidad, sin embargo, es recomendable llamar el módulo y organizar nuestro código cómo
si lo fuesemos a hacer público en algún momento.
La dirección del módulo (github.com/Jesusz0r/testModule
) no solo sirve como una dirección para
importar nuestros paquetes, si no que también sirve para indicar a donde tiene que ir la herramienta
de comandos de Go para descargarlo si algún día decidimos hacerlo público.
Una dirección de importación es un string
que se usa para importar un paquete. La dirección
para importar un paquete es el nombre del módulo (github.com/Jesusz0r/testModule
) más el nombre
del subdirectorio donde se encuentra nuestro paquete. Por ejemplo:
// archivo main.go
import "github.com/Jesusz0r/testModule/testPackage"
Teniendo en cuenta que ya habíamos creado un módulo usando go mod init
y le dimos un nombre de
github.com/Jesusz0r/testModule
y que tenemos un subdirectorio llamado testPackage
dentro
de nuestro proyecto, el comando anterior se encargará de importar el paquete testPackage
y
nos permite usar todas las funciones, tipos, variables y constantes definidas y exportadas
dentro de ese paquete.
¿Cómo exportamos y usamos funciones, tipos, variables, etc?
Para exportar cualquier cosa desde nuestro paquete, tenemos que declararlo con la primera letra en mayúsculas. Por ejemplo:
// archivo testPackage.go
import "fmt"
type TestType struct {
name string
}
func PrintNewTestType(t TestType) {
fmt.Println(newTestType)
}
Gracias a que estamos declarando TestType
y PrintNewTestType
con la primera letra mayúscula,
Go detecta que queremos exportar esos tipos de datos. Gracias a esto luego podremos hacer:
// archivo main.go
package main
import "github.com/Jesusz0r/testModule/testPackage"
func main() {
newTestType = testPackage.TestType{
name: "New test type"
}
testPackage.PrintNewTestType(newTestType)
}
En resumen
Los paquetes nos permiten organizar nuestro código de una manera modular, lo que hace que nuestro código sea más legible y fácil de entender. Los módulos nos permiten crear una dirección o alias para poder importar nuestros paquetes de forma más sencilla