Introducción a GraphQL y Go
GraphQL es un lenguaje de consultas para API que permite a los clientes obtener exactamente los datos que necesitan, y nada más. A diferencia de REST, donde cada endpoint devuelve una estructura de datos fija, GraphQL brinda flexibilidad y control. En combinación con Go (Golang), un lenguaje rápido, con seguridad de tipos y simple, obtienes una herramienta poderosa para crear servicios web modernos.
En este tutorial crearemos una API GraphQL simple en Go desde cero. Aprenderás a instalar dependencias, describir el esquema, implementar resolutores y ejecutar el servidor. El artículo está orientado a principiantes, por lo que todos los pasos están explicados en detalle.
1. Preparación del proyecto e instalación de dependencias
Antes de escribir código, asegúrate de tener instalado Go versión 1.18 o superior. Crea un nuevo directorio para el proyecto e inicializa el módulo:
mkdir graphql-go-tutorialcd graphql-go-tutorialgo mod init graphql-go-tutorialElección de la biblioteca: gqlgen
Existen varias bibliotecas para trabajar con GraphQL en Go. Usaremos gqlgen, un popular generador de código que crea tipos y resolutores basados en el esquema. Instálalo:
go get github.com/99designs/gqlgen@latestInicialización de gqlgen
Ejecuta el comando para crear los archivos por defecto:
go run github.com/99designs/gqlgen initEste comando creará varios archivos:
graph/schema.graphqls— archivo del esquema GraphQL;graph/resolver.go— plantilla de resolutores;server.go— punto de entrada del servidor;gqlgen.yml— configuración de generación.
2. Descripción del esquema GraphQL
Abre el archivo graph/schema.graphqls. Por defecto ya hay un ejemplo con el tipo Todo. Lo ampliaremos agregando el tipo User y algunas consultas.
Reemplaza el contenido del archivo por lo siguiente:
type User { id: ID! name: String! email: String!}
type Todo { id: ID! text: String! done: Boolean! user: User!}
type Query { todos: [Todo!]! users: [User!]! user(id: ID!): User}
type Mutation { createTodo(text: String!, userId: ID!): Todo! markDone(id: ID!): Todo!}Aquí definimos:
- User — usuario con campos id, name, email.
- Todo — tarea con campos id, text, done y una referencia al usuario.
- Query — puntos de entrada para lectura de datos.
- Mutation — operaciones para modificar datos.
3. Generación de código e implementación de resolutores
Después de describir el esquema, necesitas generar el código Go. Ejecuta:
go run github.com/99designs/gqlgen generateEsto creará los archivos models_gen.go y actualizará resolver.go. Ahora abre graph/resolver.go.
Agregar almacenamiento de datos
Para simplificar, almacenaremos los datos en memoria. Agrega la estructura en resolver.go:
type Resolver struct { Users []*model.User Todos []*model.Todo}No olvides importar el paquete model.
Implementación de consultas (Query)
Busca los métodos generados para Query. Los implementamos:
func (r *queryResolver) Todos(ctx context.Context) ([]*model.Todo, error) { return r.Resolver.Todos, nil}
func (r *queryResolver) Users(ctx context.Context) ([]*model.User, error) { return r.Resolver.Users, nil}
func (r *queryResolver) User(ctx context.Context, id string) (*model.User, error) { for _, u := range r.Resolver.Users { if u.ID == id { return u, nil } } return nil, fmt.Errorf("user not found")}
Blogs
Book Recommendations
Leer también
Código limpio en JavaScript: guía para quienes escriben para personas
Código cache-friendly en C++: qué es y por qué es importante para la velocidad
Type hints en Python: guía completa con ejemplos
Patrones de diseño en Swift: ejemplos de código para desarrolladores iOS
Trabajo con fechas y horas en Swift: técnicas avanzadas