API GraphQL con Go: tutorial práctico paso a paso

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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-tutorial


Paso 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@latest


Paso 3: Generación del esqueleto del proyecto

Ejecute el comando de inicialización:

go run github.com/99designs/gqlgen init

Después de la ejecución, verá la estructura:

  • graph/ — carpeta con el esquema y resolvers
  • server.go — punto de entrada
  • gqlgen.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 generate

Esto 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

Blogs

Book Recommendations