Los paquetes en Go son el bloque fundamental para organizar el código y gestionar los ámbitos de visibilidad. Históricamente, Go eligió un modelo simple de importaciones y jerarquía de carpetas para hacer que la programación sea transparente y evitar ambigüedades en la resolución de dependencias, como sucedía en C/C++ y Java. El problema que Go resuelve es la creación de una estructura de proyecto comprensible, evitando conflictos de nombres y la independencia de los módulos entre sí.
Problema: Sin un enfoque unificado de organización, no es posible escalar la aplicación, surgen duplicados, conflictos de nombres y dependencias cíclicas. Es importante monitorear explícitamente el ámbito de visibilidad de los objetos.
Solución: Cada directorio contiene un archivo con el paquete (package somepackage), el nombre del directorio y el nombre del paquete coinciden según las mejores prácticas. La importación se realiza a través de la palabra clave import, y solo los objetos con letras mayúsculas se exportan. La gestión de dependencias se realiza a través de go modules (go.mod).
Ejemplo de estructura e importación:
// internal/mathops/add.go package mathops func Add(a, b int) int { return a + b } // main.go package main import ( "fmt" "myservice/internal/mathops" ) func main() { fmt.Println(mathops.Add(2, 3)) }
Características clave:
¿Se pueden declarar varios paquetes diferentes en un mismo directorio?
No, todos los archivos en un directorio deben pertenecer a un solo paquete.
¿Se convertirán las funciones en exportables si tienen nombres en mayúsculas, aunque el paquete esté nombrado con minúsculas?
Sí, la exportación depende únicamente de la primera letra del nombre del objeto (función, tipo, variable), no del nombre del paquete.
¿Se puede importar un paquete con un alias diferente, y afectará esto a la visibilidad de las funciones?
Sí, es posible. El alias solo afecta al nombre con el que se llama al paquete, pero no cambia el ámbito de visibilidad:
import mymath "myservice/internal/mathops" mymath.Add(1,2)
Un desarrollador agrupa todas las funciones en un solo archivo "utils.go" en el paquete main, sin separar la lógica de negocio en paquetes individuales.
Pros:
Contras:
La lógica de negocio, utilidades, manejadores, modelos de datos se extraen a paquetes independientes: mathops, user, storage, api. La importación se realiza estrictamente según el propósito, cada paquete se prueba de forma independiente.
Pros:
Contras: