Biblioteca GraphQL Go (Golang) — ferramenta poderosa para criar APIs
GraphQL é uma linguagem de consulta para APIs que permite aos clientes solicitar apenas os dados de que realmente precisam. No ecossistema Go (Golang), uma das bibliotecas mais populares para trabalhar com GraphQL é o gqlgen (GraphQL Go Generate). Esta biblioteca permite criar servidores GraphQL type-safe com o mínimo de código boilerplate. Neste artigo, vamos detalhar o gqlgen, sua instalação, configuração e exemplos de uso.
O que é gqlgen?
gqlgen é um gerador de código para Go que cria automaticamente resolvers e tipos com base no seu esquema GraphQL. Principais vantagens:
- Type-safe — todos os tipos são verificados em tempo de compilação
- Mínimo de código boilerplate — a biblioteca gera a maior parte do código para você
- Flexibilidade — suporte a subscrições, mutações e consultas complexas
- Desempenho — alta velocidade de execução, característica do Go
Instalação do gqlgen
Para começar, instale a biblioteca e a ferramenta de linha de comando:
go get github.com/99designs/gqlgengo run github.com/99designs/gqlgen initO comando init criará uma estrutura básica de projeto com os arquivos schema.graphqls, gqlgen.yml e código gerado.
Estrutura do projeto
Após a inicialização, você obterá a seguinte estrutura:
my-graphql-app/├── gqlgen.yml # Configuração do gerador├── graph/│ ├── schema.graphqls # Esquema GraphQL│ ├── resolver.go # Resolvers (seu código)│ └── models_gen.go # Modelos gerados (não editar)├── server.go # Ponto de entrada└── go.modEscrevendo o esquema GraphQL
Exemplo de arquivo schema.graphqls para um blog simples:
type Query { posts: [Post!]! post(id: ID!): Post}
type Mutation { createPost(input: PostInput!): Post! deletePost(id: ID!): Boolean!}
type Post { id: ID! title: String! content: String! author: String! createdAt: Time!}
input PostInput { title: String! content: String! author: String!}
scalar TimeGeração de código
Após descrever o esquema, execute:
go run github.com/99designs/gqlgen generateIsso criará os arquivos models_gen.go e generated.go com tipos e interfaces de resolvers.
Implementação dos resolvers
Agora é necessário implementar a lógica em resolver.go:
package graph
import ( "context" "time")
// Modelo de dadostype Post struct { ID string `json:"id"` Title string `json:"title"` Content string `json:"content"` Author string `json:"author"` CreatedAt time.Time `json:"createdAt"`}
// Armazenamento em memóriavar posts = []*Post{ { ID: "1", Title: "Introdução ao GraphQL", Content: "GraphQL é uma linguagem de consulta...", Author: "João Silva", CreatedAt: time.Now(), },}
// Resolver para Query.postsfunc (r *queryResolver) Posts(ctx context.Context) ([]*Post, error) { return posts, nil}
// Resolver para Query.postfunc (r *queryResolver) Post(ctx context.Context, id string) (*Post, error) { for _, post := range posts { if post.ID == id { return post, nil } } return nil, nil}
// Resolver para Mutation.createPostfunc (r *mutationResolver) CreatePost(ctx context.Context, input PostInput) (*Post, error) { newPost := &Post{ ID: fmt.Sprintf("%d", len(posts)+1), Title: input.Title, Content: input.Content, Author: input.Author, CreatedAt: time.Now(), } posts = append(posts, newPost) Também na biblioteca
Testes em Swift (iOS/macOS): frameworks e ferramentas
Compression em JavaScript (Node.js): guia completo com exemplos
Rate Limiting em Swift: gerenciamento de frequência de requisições em iOS/macOS
Cache em TypeScript: Redis e outras soluções para Node.js
InversifyJS: Contêiner IoC para aplicações TypeScript