Pular para o conteúdo

Tutorial Go Gin: Como Criar APIs REST Rápidas e Sem Complicação

Cansado de escrever código repetitivo? Aprenda a usar o Gin, o framework web mais popular do Go, para criar APIs robustas, lidar com rotas e validar JSONs em segundos.

Se você seguiu nosso guia anterior onde criamos uma API com net/http, você aprendeu os fundamentos. Você sentiu a força bruta do Go usando apenas a biblioteca padrão (net/http).

Mas você também deve ter notado algo: dá trabalho. Para ler um JSON enviado pelo usuário, você teve que configurar o Decoder. Para pegar um ID da URL, foi uma ginástica de strings.

No mundo profissional, tempo é dinheiro. Nós amamos a biblioteca padrão do Go, mas para construir APIs complexas e produtivas, nós usamos Frameworks. E o rei indiscutível dos frameworks em Go chama-se Gin.

O Gin promete ser até 40 vezes mais rápido que outros frameworks, mas o principal benefício para nós não é só a velocidade de execução, é a velocidade de desenvolvimento.

Hoje, vamos pegar aquele nosso conhecimento de API e dar um “upgrade”. Vamos ver como o Gin transforma 20 linhas de código chato em 3 linhas elegantes.

O Que o Gin Resolve Para Você?

Basicamente, o Gin tira a dor de três coisas:

  1. Roteamento Inteligente: Quer criar uma rota /usuarios/:id? No Gin isso é nativo.
  2. Validação de JSON (Binding): Ele pega o JSON que o usuário enviou e joga direto para dentro da sua struct, já validando se os tipos estão certos.
  3. Middlewares: Precisa checar se o usuário está logado antes de deixar ele acessar a rota? Com o Gin, isso é trivial.

Mão na Massa: Instalando o Gin

Vamos criar um novo projeto para testar. No seu terminal:

  1. Crie a pasta: mkdir aprendendo-gin e entre nela.
  2. Inicie o Go: go mod init meunome/gin
  3. Baixe o Gin: go get -u github.com/gin-gonic/gin

O “Hello World” mais Rápido da sua Vida

Crie um arquivo main.go. Olha como a sintaxe é limpa:

Go

package main

import "github.com/gin-gonic/gin"

func main() {
	// 1. Inicializa o Router (o roteador padrão do Gin)
	r := gin.Default()

	// 2. Define uma rota GET simples
	r.GET("/ping", func(c *gin.Context) {
		// Retorna um JSON com status 200 automaticamente
		c.JSON(200, gin.H{
			"mensagem": "pong",
			"status":   "sucesso",
		})
	})

	// 3. Roda o servidor na porta 8080
	r.Run() // ou r.Run(":3000") para outra porta
}

Rode com go run main.go e acesse localhost:8080/ping. Viu? Sem json.NewEncoder, sem setar headers manualmente. O c.JSON faz tudo.

O Poder Real: Recebendo Dados (JSON Binding)

Aqui é onde você vai se apaixonar. Vamos imaginar que queremos cadastrar um produto. O Gin vai ler o JSON, checar se está certo e colocar na nossa variável.

Go

package main

import (
	"net/http"
	"github.com/gin-gonic/gin"
)

// Definimos nossa estrutura.
// As 'tags' dizem ao Gin qual campo do JSON olhar.
// 'binding:"required"' torna o campo OBRIGATÓRIO automaticamente!
type Produto struct {
	Nome  string  `json:"nome" binding:"required"`
	Preco float64 `json:"preco" binding:"required"`
}

func main() {
	r := gin.Default()

	r.POST("/produtos", func(c *gin.Context) {
		var novoProduto Produto

		// A MÁGICA: ShouldBindJSON tenta ler o corpo da requisição
		// e encaixar na struct. Se falhar (ex: faltou o preço), ele retorna erro.
		if err := c.ShouldBindJSON(&novoProduto); err != nil {
			c.JSON(http.StatusBadRequest, gin.H{"erro": err.Error()})
			return
		}

		// Se chegou aqui, o JSON é válido!
		// Aqui você chamaria seu banco de dados (que aprendemos no artigo de Postgres)
		
		c.JSON(http.StatusCreated, gin.H{
			"mensagem": "Produto criado com sucesso!",
			"produto":  novoProduto,
		})
	})

	r.Run()
}

Tente enviar um JSON sem o campo “preco” usando o Postman ou Insomnia. O Gin vai rejeitar automaticamente. Sem nenhum if manual da sua parte!

Agrupando Rotas (Organização)

Em sistemas grandes, você não joga todas as rotas soltas. Você as agrupa. O Gin facilita isso:

Go

func main() {
	r := gin.Default()

	// Grupo de rotas da API v1
	v1 := r.Group("/api/v1")
	{
		v1.GET("/usuarios", listarUsuarios)
		v1.GET("/usuarios/:id", pegarUsuario) // Rota com parâmetro!
	}

	// No futuro, se tiver uma v2...
	v2 := r.Group("/api/v2")
	{
		v2.GET("/usuarios", listarUsuariosV2)
	}
	
	r.Run()
}

// Exemplo de como pegar o ID da URL
func pegarUsuario(c *gin.Context) {
	id := c.Param("id") // Pega o que vier depois de /usuarios/
	c.JSON(200, gin.H{"usuario_id": id})
}

Sabedoria do Especialista: Framework vs. Biblioteca

Muitos puristas de Go vão dizer: “Não use frameworks, use a biblioteca padrão!”. Eles têm um ponto: para microsserviços minúsculos, o net/http é suficiente.

Mas para aplicações reais, com prazos apertados e equipes grandes, o Gin padroniza o seu código. Ele evita que cada desenvolvedor reinvente a roda de como ler um JSON ou como tratar um erro.

O segredo é o equilíbrio. Aprenda o net/http (como você já fez) para saber como as coisas funcionam por baixo do capô, mas use o Gin para entregar valor rápido no dia a dia.

Conclusão: Sua API Ficou Profissional

Hoje você trocou a bicicleta por uma moto esportiva. Com o Gin, você escreve menos, erra menos e entrega APIs mais robustas.

Agora, o desafio final para você consolidar tudo o que aprendeu no blog até hoje: Pegue o código do artigo Conectando Go ao PostgreSQL e reescreva-o usando Gin. Em vez de usar o roteamento manual, use as rotas do Gin. Em vez de ler JSON na mão, use o ShouldBindJSON.

Se você fizer isso, você terá em mãos o esqueleto de uma aplicação profissional que poderia ser usada em qualquer startup hoje.

Já conhecia o Gin ou usava outro framework (como Echo ou Fiber)?