Introdução: Por que Go é ideal para REST API?
Go (ou Golang) é uma linguagem de programação moderna e compilada, criada no Google. Ela combina o desempenho do C++ com a simplicidade do Python, tornando-se a escolha ideal para criar serviços web de alta carga e REST APIs. Ao contrário de muitas outras linguagens, Go possui suporte nativo a servidor HTTP, concorrência e compilação rápida.
Neste guia, criaremos passo a passo uma REST API completa para gerenciar uma lista de tarefas (Todo List). Você aprenderá a:
- Configurar um servidor HTTP em Go
- Trabalhar com requisições e respostas JSON
- Implementar operações CRUD (Create, Read, Update, Delete)
- Testar a API usando curl ou Postman
Todo o processo levará no máximo 30 minutos. Vamos lá!
1. Instalação e configuração do projeto
Antes de escrever código, certifique-se de que o Go está instalado. Você pode verificar isso com o comando:
go versionSe o Go não estiver instalado, baixe a versão mais recente no site oficial.
Crie um novo diretório para o projeto e inicialize o módulo:
mkdir go-rest-apicd go-rest-apigo mod init go-rest-apiAgora crie o arquivo main.go — todo o nosso código estará nele. Para facilitar o trabalho com rotas, usaremos a biblioteca padrão net/http, que já vem embutida no Go. Nenhuma dependência externa é necessária — esta é uma das principais vantagens da linguagem.
2. Definindo a estrutura de dados e o armazenamento
Vamos começar descrevendo o modelo de dados. Para simplificar, armazenaremos as tarefas na memória (em um slice), e não em um banco de dados. Criaremos a estrutura Task e um contador global de IDs:
package main
import ( "encoding/json" "log" "net/http" "strconv" "strings" "sync")
// Task representa uma tarefatype Task struct { ID int `json:"id"` Title string `json:"title"` Done bool `json:"done"`}
// Armazenamento de tarefas (em memória)var ( tasks []Task nextID int = 1 mu sync.Mutex)Observe o sync.Mutex — ele é necessário para acesso thread-safe aos dados, já que o servidor Go pode processar requisições em paralelo.
3. Implementação das operações CRUD
Agora escreveremos os handlers principais para cada método HTTP. Usaremos o padrão de roteamento por URL:
GET /tasks— obter todas as tarefasPOST /tasks— criar uma nova tarefaGET /tasks/{id}— obter uma tarefa pelo IDPUT /tasks/{id}— atualizar uma tarefaDELETE /tasks/{id}— deletar uma tarefa
3.1. Obtendo todas as tarefas (GET /tasks)
func getTasks(w http.ResponseWriter, r *http.Request) { mu.Lock() defer mu.Unlock()
w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(tasks)}3.2. Criando uma tarefa (POST /tasks)
func createTask(w http.ResponseWriter, r *http.Request) { var newTask Task if err := json.NewDecoder(r.Body).Decode(&newTask); err != nil { http.Error(w, "Invalid JSON", http.StatusBadRequest) return }
mu.Lock() newTask.ID = nextID nextID++ tasks = append(tasks, newTask) mu.Unlock()
w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusCreated) json.NewEncoder(w).Encode(newTask)}3.3. Obtendo, atualizando e deletando por ID
Para essas operações, precisamos extrair o ID da URL. Na biblioteca padrão do Go não há um parser de caminhos embutido, então escreveremos uma pequena utilidade: