Introducción
GraphQL es un lenguaje de consultas moderno para API, desarrollado por Facebook. A diferencia de REST, permite al cliente solicitar solo los datos necesarios, lo que reduce la carga en la red y acelera el desarrollo. En este tutorial crearemos una API GraphQL completa en el lenguaje Go (Golang) utilizando la popular biblioteca gqlgen. Aprenderá cómo configurar el servidor, definir el esquema, escribir resolvers y ejecutar consultas. El artículo está orientado a desarrolladores familiarizados con los conceptos básicos de Go, pero incluso los principiantes podrán seguir los pasos gracias a comentarios detallados.
1. Configuración del proyecto e instalación de dependencias
Primero crearemos un nuevo proyecto Go e instalaremos los paquetes necesarios.
Paso 1: Inicialización del módulo
mkdir graphql-go-tutorialcd graphql-go-tutorialgo mod init graphql-go-tutorialPaso 2: Instalación de gqlgen
gqlgen es un generador de código GraphQL para Go. Crea automáticamente resolvers basados en el esquema.
go get github.com/99designs/gqlgen@latestPaso 3: Generación del esqueleto del proyecto
Ejecute el comando de inicialización:
go run github.com/99designs/gqlgen initDespués de la ejecución, verá la estructura:
graph/— carpeta con el esquema y resolversserver.go— punto de entradagqlgen.yml— configuración del generador
2. Definición del esquema GraphQL
El esquema (schema) describe los tipos de datos y operaciones de la API. Abra el archivo graph/schema.graphqls y reemplace su contenido con lo siguiente:
type User { id: ID! name: String! email: String! age: Int!}
type Query { users: [User!]! user(id: ID!): User}
type Mutation { createUser(name: String!, email: String!, age: Int!): User! updateUser(id: ID!, name: String, email: String, age: Int): User deleteUser(id: ID!): Boolean}Aquí hemos definido:
- User — objeto con campos id, name, email, age.
- Query — operaciones de lectura (obtener todos los usuarios o uno por ID).
- Mutation — operaciones de escritura (crear, actualizar, eliminar).
Después de guardar, ejecute la generación de código:
go run github.com/99designs/gqlgen generateEsto creará los archivos models_gen.go (tipos Go) y generated.go (interfaces de resolvers).
3. Implementación de resolvers y almacenamiento de datos
Ahora necesitamos escribir la lógica para procesar las consultas. Para simplificar, almacenaremos los datos en memoria (slice de estructuras).
Paso 1: Creamos el almacenamiento
Cree el archivo graph/store.go:
package graph
import "sync"
type Store struct { mu sync.RWMutex users []User nextID int}
func NewStore() *Store { return &Store{ users: []User{ {ID: "1", Name: "Alice", Email: "alice@example.com", Age: 30}, {ID: "2", Name: "Bob", Email: "bob@example.com", Age: 25}, }, nextID: 3, }}
func (s *Store) GetUsers() []User { s.mu.RLock() defer s.mu.RUnlock() return s.users}
func (s *Store) GetUser(id string) *User { s.mu.RLock() defer s.mu.RUnlock() for _, u := range s.users { if u.ID == id { return &u } } return nil}
func (s *Store) CreateUser(name, email string, age int) User { s.mu.Lock() defer s.mu.Unlock() user := User{ ID: fmt.Sprintf("%d", s.nextID), Name: name, Email: email, Age: age, } s.nextID++ s.users = append(s.users, user) return user}
func (s *Store) UpdateUser(id string, name, email *string, age *int) *User { s.mu.Lock() defer s.mu.Unlock() for i, u := range s.users { if u.ID == id { if name != nil { s.users[i].Name = *name } if email