A pergunta que separa teoria de prática é: como transformar uma ideia num servidor real, que recebe requisição e devolve dado pela internet? Muita gente que está começando acha que precisa de framework complexo e centenas de linha de código. A beleza do Go é a filosofia de simplicidade da própria biblioteca padrão — dá pra ter uma API rodando sem instalar nada além do próprio Go.
Resumo rápido
- Esta é a versão “zero”: só
net/http, sem framework, sem banco — dado em memória.- Se depois disso você quiser roteamento mais rico, tem o tutorial com Gin. Se quiser persistência real com banco, tem o guia com Go + PostgreSQL.
- Meta: 20 minutos, do zero até um endpoint JSON funcionando de verdade.
Mindset Chave: O Poder do “Suficientemente Bom”
O objetivo aqui não é construir a API da Netflix. É entender o bloco de construção fundamental de qualquer API: receber um pedido (request) e enviar uma resposta (response). Essa base é o ponto de partida de toda aplicação back-end — foco no progresso, não na perfeição.
Construindo a API, Passo a Passo
1. Pré-requisitos
Tenha o Go instalado (guia oficial em go.dev/doc/install). Crie uma pasta (minha-primeira-api) e um arquivo main.go dentro dela.
2. Ligando o Servidor
package main
import (
"fmt"
"net/http"
)
// "handler": função que lida com requisição.
func homePage(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Bem-vindo à minha primeira API com Go!")
}
func main() {
http.HandleFunc("/", homePage)
fmt.Println("Servidor escutando na porta 8080...")
http.ListenAndServe(":8080", nil)
}
Rode com go run main.go e acesse http://localhost:8080 — a mensagem de boas-vindas aparece.
3. Definindo os Dados
type Livro struct {
ID string `json:"id"`
Titulo string `json:"titulo"`
Autor string `json:"autor"`
}
var livros = []Livro{
{ID: "1", Titulo: "A Arte da Guerra", Autor: "Sun Tzu"},
{ID: "2", Titulo: "O Príncipe", Autor: "Maquiavel"},
}
4. Criando o Endpoint `/livros`
func obterLivros(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
if err := json.NewEncoder(w).Encode(livros); err != nil {
http.Error(w, "erro ao gerar resposta", http.StatusInternalServerError)
}
}
func main() {
http.HandleFunc("/", homePage)
http.HandleFunc("/livros", obterLivros)
fmt.Println("Servidor escutando na porta 8080...")
http.ListenAndServe(":8080", nil)
}
Repare que já verificamos o erro do Encode aqui — em código de produção, ignorar erro de serialização é o tipo de detalhe que vira bug difícil de rastrear depois.
5. Testando
Reinicie o servidor (Ctrl+C, depois go run main.go de novo) e acesse http://localhost:8080/livros — um JSON com os dois livros aparece. Você criou e consumiu sua primeira API REST em Go.
Perguntas frequentes
Como busco um livro específico, tipo /livros/1? Com só net/http puro, isso exige parsing manual da URL — é justamente onde um roteador como gorilla/mux ou um framework como Gin economiza trabalho. Veja como isso fica com Gin.
Preciso de framework como Gin ou Echo? Pra API complexa, sim, simplifica muito roteamento, middleware e validação. Mas entender net/http puro primeiro, como fizemos aqui, ajuda a entender o que o framework está escondendo de você por baixo.
Como conecto isso a um banco de dados real? Trocando a lista em memória por uma consulta real — este guia mostra exatamente isso com Go e PostgreSQL, incluindo o roteamento HTTP completo.
Conclusão
Você foi além da teoria e construiu um servidor web funcional usando só o Go nativo — entendeu o ciclo de uma requisição HTTP, como estruturar dado com struct e como servir isso em JSON. A lógica pra servir uma lista de livro é a mesma pra servir usuário, produto ou vídeo. A semente de qualquer sistema back-end grande é exatamente essa.
Recomendação relacionada
The Go Programming Language
Escrito por Alan Donovan e Brian Kernighan, é a referência mais citada por quem quer entender Go a fundo, além do básico.
Ver na Amazon →Como Associado Amazon, Visão Binária pode ganhar uma comissão sobre compras qualificadas feitas através deste link, sem custo adicional pra você.