Ir al contenido principal

Estructurando Proyectos en Go: Guía del "Standard Layout" para Aplicaciones Reales

Cuando empiezas en Go, la libertad de su sistema de archivos puede ser abrumadora. A diferencia de frameworks como Laravel o Django, Go no te impone una estructura de carpetas. Sin embargo, la comunidad ha consolidado un patrón conocido como Standard Go Project Layout.

En este post analizamos cómo organizar una aplicación profesional (usando como ejemplo un proyecto de integración de APIs) para lograr un código escalable, testeable y fácil de mantener.

🏗️ La Anatomía del Proyecto

Una estructura robusta se ve así:

.
├── cmd/                # Entry points (Puntos de entrada)
│   └── wasabi/         # Nombre de tu aplicación
│       └── main.go     # Archivo principal
├── internal/           # Lógica privada del negocio
│   ├── handlers/       # Capa de transporte (HTTP/gRPC)
│   ├── models/         # Estructuras de datos compartidas
│   └── wuzapi/         # Clientes o adaptadores de servicios
├── go.mod              # Gestión de dependencias
└── LICENSE             # Licencia del proyecto

1. El Directorio cmd/: El Centro de Mandos

La carpeta cmd/ contiene los subdirectorios para cada ejecutable que produzca el proyecto.

¿Qué va aquí?
Solo el código necesario para inicializar la aplicación: leer variables de entorno, conectar bases de datos y arrancar el servidor.
Regla de oro:
El código en cmd/ debe ser mínimo. Si tu main.go tiene 500 líneas, probablemente estás mezclando lógica de negocio con inicialización.

2. El Poder de internal/: Encapsulamiento Real

Esta es la carpeta más importante. En Go, cualquier paquete dentro de internal/ tiene una protección especial: solo puede ser importado por paquetes del mismo proyecto.

¿Por qué usar internal/?
Evita el acoplamiento externo: nadie fuera de tu repositorio podrá usar estas librerías, permitiéndote cambiar la lógica interna sin romper código de terceros.

Organización por dominios

  • internal/handlers/: lógica de los endpoints, validación de input y respuestas.
  • internal/wuzapi/: clientes y adaptadores para APIs externas.
  • internal/models/: structs compartidos para evitar importaciones circulares.

3. Manejo de Dependencias y Modelos

Un error común es duplicar estructuras de datos. Centralizar los structs en internal/models/ crea un lenguaje común para toda la aplicación.

Flujo recomendado:
1️⃣ El Handler recibe el JSON y lo mapea a un Model.
2️⃣ El Handler pasa el Model al servicio (Wuzapi).
3️⃣ El Servicio procesa y retorna otro Model.

💡 3 Buenas Prácticas para Recordar

  • Mantén los handlers delgados: el handler solo se ocupa de HTTP (status, headers, parsing). La lógica pesada vive en internal/.
  • Inyección de dependencias: pasa clientes y servicios como dependencias. Facilita muchísimo el testing.
  • Evita pkg/ al inicio: úsalo solo si vas a exponer librerías reutilizables. Para APIs y servidores, internal/ es el estándar de oro.

Conclusión

Seguir el Standard Go Project Layout no es una ley, pero sí la forma más rápida de que tu proyecto se sienta profesional. Separar la inicialización (cmd/) de la lógica privada (internal/) permite que tu código crezca sin convertirse en una maraña imposible de mantener.

Comentarios

Entradas populares de este blog

Instalación y Configuración de MySQL 5.7 en Ubuntu 24.04 LTS

Instalar MySQL 5.7 en Ubuntu 24.04 1. Descargar e instalar MySQL Copiar mkdir ~/mysql57 cd ~/mysql57 wget https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz tar -zxvf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz sudo mv mysql-5.7.44-linux-glibc2.12-x86_64 /usr/local/mysql sudo ln -s /usr/local/mysql/bin/mysql /usr/local/bin/mysql 2. Instalar dependencias necesarias IMPORTANTE: Se descargan las versiones nuevas de las librerías y se las vincula con las librerías que necesita MySQL. Copiar sudo apt update # Reemplazo de libaio sudo apt install libaio1t64 # Reemplazo de libtinfo y ncurses sudo apt install libtinfo6 libncurses6 Copiar # Crear los enlaces simbólicos sudo ln -sf /usr/lib/x86_64-linux-gnu/libaio.so.1t64 /usr/lib/libaio.so.1 sudo ln -sf /usr/lib/x86_64-linux-gnu/libtinfo.so.6 /usr/lib/x86_64-linux-gnu/libtinfo.so.5 sudo ln -sf /usr/lib/x86_64-linux-gnu/libncurses.so.6 /usr/lib/x86_64...

Instalar Evolution API en Docker con Redis y PostgreSQL Local

Instalar Evolution API en Docker con Redis y PostgreSQL Local En este tutorial vamos a levantar Evolution API usando Docker , con soporte de Redis para sesiones y PostgreSQL local para almacenar datos de manera persistente y compartida entre varios usuarios. 1. Estructura del proyecto Crea una carpeta para tu proyecto y colócate en ella: mkdir -p ~/docker/evolution-api cd ~/docker/evolution-api 2. Archivo docker-compose.yml Este compose levanta Redis y Evolution API : version: "3.9" services: # ✅ SERVICIO REDIS redis: container_name: evolution_redis image: redis:7-alpine restart: unless-stopped ports: - "6379:6379" volumes: - redis_data:/data command: redis-server --save 60 1 --loglevel warning # ✅ SERVICIO EVOLUTION API evolution-api: container_name: evolution_api image: atendai/evolution-api restart: unless-stopped ports: - "8085:8080" env_file: - .env ...

Instalar Jasper Studio 6.21 para Ubuntu 24.04

Instalar js-studiocomm_6.21.3 en Ubuntu 24.4 Para instalar Jaspersoft Studio en Ubuntu 24.4, sigue estos pasos: 1. Descargar Jasper Studio Descarga la versión js-studiocomm_6.21.3 desde el siguiente enlace: Jaspersoft Studio 6.21.3 2. Crear el directorio de instalación mkdir /opt/jasperstudio 3. Mover el archivo descargado mv /dir_descarga/js-studiocomm_6.21.3_linux_x86_64.tgz /opt/jasperstudio/ cd /opt/jasperstudio 4. Extraer el archivo tar -xvzf js-studiocomm_6.21.3_linux_x86_64.tgz cd js-studiocomm_6.21.3 5. Ejecutar Jaspersoft Studio ./Jaspersoft\ Studio 6. Crear acceso directo en el escritorio Para facilitar el acceso, crea un archivo .desktop en el escritorio: gedit ~/Escritorio/jaspersoft-studio.desktop En el archivo jaspersoft-studio.desktop , agrega lo siguiente: [Desktop Entry] Version=1.0 Ty...