
Mi primer proyecto con Go
hace 6 meses | 4 min read
Notas del autor:
Saludos, quería que esta entrada en mi blog fuese un poco más completa, es decir, quería hacer un proyecto un poco más grande, pero después de ponerme manos a la obra me di cuenta de que mi conocimiento sobre patrones de arquitectura está aún en desarrollo. Lo bueno es que puedo detectar mis carencias y enfocarme en eliminarlas. Ya estoy estudiando acerca de patrones de arquitectura con un curso de Udemy, así que más temprano que tarde haré una serie de posts para crear un proyecto un poco más complejo pero educativo para mí mismo. Este es el primer post de muchos en el cual voy a publicar y enseñar qué estoy aprendiendo o haciendo en mis tiempos libres, todo lo relacionado con programación y su despliegue en un servidor.
Después de ver un curso de Go en Udemy que se centraba en el lenguaje de programación sin usarlo con ningún framework, me dispongo a iniciar un proyecto con Go y el framework Gin, en el cual voy a hacer una API Rest para un sistema de blog, algo muy básico para empezar a adentrarme en Go. Tendré endpoints para usuarios, para posts y también para categorías. A medida que voy escribiendo este post voy a ir programando, de tal forma que pueda describir todo el proceso.
El comienzo
Como desconozco completamente el framework, empecé por leer la documentación de Gin Gin Web Framework pero quería ver algo que contuviera más información para lo que yo quería hacer. Como en internet se consigue todo, encontré este video que explicaba cómo hacer un CRUD con Gin framework y también implementaba el ORM GORM (Enlace al video).
Al ver el video noté que la estructura de carpetas era un poco básica, entonces decidí hacer mi propia estructura sin saber muy bien cuál es el estándar en Gin o en Go en general. Pero por ahora no me interesa ver todos los detalles de cómo se escribe un código perfecto en Go, por lo cual decidí simplemente centrarme en conseguir mi objetivo, que es el de hacer un proyecto que funcione. Otra cosa que voy a hacer diferente es la base de datos, ya que me gustaría que fuese un proyecto el cual se pueda descargar y usar para verificar su funcionamiento. En el video se muestra que usa un servicio de base de datos, por mi parte, creé un docker-compose.yml
para montar un contenedor de PostgreSQL y que Gin se pueda conectar a este de forma local.
Para empezar, la estructura que decidí que tuviera el proyecto sería la siguiente:
├── src
│ ├── database
│ │ ├── models
| | | ├── post.go
│ │ ├── migrations.go
│ ├── plugins
│ | ├── database.go
│ | ├── dotenv.go
│ ├── presentation
│ │ ├── controllers
| | | ├── post_controller.go
│ │ ├── server
| | | ├── server.go
│ ├── repositories
│ | ├── post_repository.go
└── main.go
Es un poco sencilla, y como parte de todo aprendizaje he detectado que no he estudiado mucho acerca de patrones de arquitectura. Esta estructura es un intento de que sea algo organizado y simulando un poco cómo estructura los proyectos Fernando Herrera en algunos de sus cursos en Devtalles; la verdad no mucho, pero sí le eché un ojo a sus clases antes de hacer la estructura y por lo menos el server.go
es algo similar a cómo él lo hace en TypeScript en el curso de Node.js.
database
En este directorio hay un archivo para correr las migraciones y un directorio para los modelos
plugins
Aquí se encuentran archivos que están relacionados con librerías, como lo puede ser godotenv
y gorm
.
presentation
En la capa presentation quise colocar todo lo que esté de cara al cliente, como lo es la implementación del servidor de Gin y los controladores que básicamente son los métodos asociados a las rutas (las cuales definí directamente en server.go
).
repositories
En este directorio coloqué la lógica de acceso a datos. Aquí se implementan las operaciones CRUD sobre la base de datos utilizando GORM. La idea es que cada modelo tenga su propio repositorio, donde se defina cómo interactuar con la base de datos.
Fin
No continuaré dando más detalles acerca del código o la estructura del proyecto. Colocaré el repositorio de GitHub de este proyecto. Quería que este fuese un proyecto un poco más complejo en el cual iba a crear diferentes entradas en mi blog narrando cómo voy aprendiendo, pero antes de hacer algo similar estudiaré más acerca de patrones de estructuras como lo podría ser el DDD para hacer un proyecto sencillo pero bien estructurado. Luego de estudiar y repasar el DDD iré pensando cómo hacer validaciones en mis peticiones HTTP, cómo implementar middlewares y demás cosas. Al ser un programador PHP estoy muy ligado a Laravel, el cual es un framework que tiene muchas herramientas que te facilitan el trabajo al desarrollar.
Por lo tanto, mis siguientes pasos serán:
- Aprender acerca DDD y Clean Architecture
- Implementar validaciones en mis peticiones
- Aplicar middlewares y herramientas que me permitan identificar a un usuario como lo pueden ser los JSON Web Tokens
Y demás cosas...
Repositorio del proyecto: https://github.com/RosaLeaveMeAlone/first-gin-crud