Introdução: Por que Go é ideal para REST APIs?
Go (Golang) é uma linguagem de programação compilada moderna, criada no Google. Ela combina o alto desempenho do C++ com a simplicidade do Python. Se você precisa escrever uma REST API rapidamente, Go é uma das melhores escolhas. Neste artigo, criaremos uma REST API completa em Go em 30 minutos, usando apenas a biblioteca padrão net/http. Você verá como é simples processar requisições HTTP, roteá-las e retornar respostas JSON.
Ao final do artigo, você será capaz de escrever sua própria API, que pode ser implantada em um servidor. Não usaremos frameworks de terceiros — apenas Go puro, o que torna o código leve e rápido.
Passo 1: Instalação do Go e criação do projeto
Instalação do Go
Se você ainda não tem o Go instalado, baixe a versão mais recente do site oficial. Siga as instruções para o seu sistema operacional. Após a instalação, verifique a versão no terminal:
go versionVocê deve ver algo como go version go1.22.0 linux/amd64.
Criação do projeto
Crie um novo diretório para o projeto e inicialize o módulo Go:
mkdir go-rest-apicd go-rest-apigo mod init go-rest-apiAgora a estrutura do projeto está pronta. Escreveremos todo o código em um único arquivo main.go para não complicar o exemplo.
Passo 2: Servidor HTTP simples em Go
Vamos começar com um servidor HTTP básico. Abra o arquivo main.go e adicione o seguinte código:
package main
import ( "fmt" "log" "net/http")
func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello, REST API on Go!") })
log.Println("Servidor iniciado na porta 8080") log.Fatal(http.ListenAndServe(":8080", nil))}Inicie o servidor com o comando go run main.go e abra o navegador em http://localhost:8080. Você verá uma mensagem de boas-vindas. Parabéns — seu primeiro servidor HTTP em Go está funcionando!
Análise do código
http.HandleFunc— registra um handler para a rota "/".http.ListenAndServe— inicia o servidor na porta 8080.log.Fatal— exibe um erro se o servidor não iniciar.
Passo 3: Adicionando roteamento e manipulação de JSON
Agora vamos adicionar suporte ao estilo REST: GET, POST, PUT, DELETE. Criaremos um simples "banco de dados" em memória (um slice de structs) e gerenciaremos uma lista de tarefas (todo list).
Estrutura de dados
Adicione em main.go a descrição da struct Task e um slice global:
type Task struct { ID int `json:"id"` Name string `json:"name"`}
var tasks []Taskvar nextID int = 1Handlers de rotas
Criaremos um handler principal que analisará o método HTTP e chamará a função apropriada:
func tasksHandler(w http.ResponseWriter, r *http.Request) { switch r.Method { case http.MethodGet: getTasks(w, r) case http.MethodPost: createTask(w, r) default: http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) }}
func taskHandler(w http.ResponseWriter, r *http.Request) { // Extrai o ID da URL idStr := strings.TrimPrefix(r.URL.Path, "/tasks/") id, err := strconv.Atoi(idStr) if err != nil { http.Error(w, "Invalid task ID", http.StatusBadRequest) return }
switch r.Method { case http.MethodGet: getTask(w, r, id) case http.MethodPut: updateTask(w, r, id) case http.MethodDelete: deleteTask(w, r, id) default: http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) }}