Jesús Mendoza

Notas de Go - Organización del código

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

En las próximas notas hablaremos más a profundidad cómo manejar tipos en funciones, structs, etc.