gorilla/mux: Rotas Regex e Correspondência de Host
gorilla/mux é um roteador maduro para net/http que enfatiza restrições explícitas de rota: variáveis de caminho regex, roteamento baseado em host, cabeçalhos, consultas e esquemas.
Busque em todas as páginas da documentação
gorilla/mux é um roteador maduro para net/http que enfatiza restrições explícitas de rota: variáveis de caminho regex, roteamento baseado em host, cabeçalhos, consultas e esquemas.
Ele se destaca quando os URLs carregam formatos rigorosos (IDs com prefixos, segmentos de versão, subdomínios de locatário) que a correspondência de segmento no estilo chi expressa de forma desajeitada.
mux compila rotas em uma lista de correspondentes avaliada por solicitação.
Cada rota pode exigir métodos HTTP, nomes de host, cabeçalhos e chaves de consulta, além de modelos de caminho.
Os handlers permanecem compatíveis com a stdlib, mas o projeto está em modo de manutenção - escolha mux quando seus correspondentes resolverem um problema real de roteamento, não por padrão para novos serviços.
Cartão de receita de referência rápida - pronto para copiar e colar.
r := mux.NewRouter()
r.Host("{tenant}.example.com").
Path("/api/v{version:[0-9]+}/items/{id:[a-z]+}").
Methods(http.MethodGet).
HandlerFunc(getItem)Quando usar isso:
{tenant}.api.example.com)id deve corresponder a [0-9]{6})Accept, cabeçalhos de autenticação personalizados) ou presença de consultapackage main
import (
"encoding/json"
"net/http"
"strconv"
"github.com/gorilla/mux"
)
type item struct {
ID string `json:"id"`
Version int `json:"version"`
Tenant string `json:"tenant"`
}
func getItem(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
out := item{
ID: vars["id"],
Version: mustAtoi(vars["version"]),
Tenant: vars["tenant"],
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(out)
}
func mustAtoi(s string) int {
n, _ := strconv.Atoi(s)
return n
}
func main() {
r := mux.NewRouter()
api := r.Host("{tenant:[a-z0-9-]+}.localhost").Subrouter()
api.HandleFunc("/v{version:[0-9]+}/items/{id:[a-z]{3,}}", getItem).Methods(http.MethodGet)
r.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("ok"))
})
http.ListenAndServe(":8080", r)
}O que isso demonstra:
mux.Vars mapeia capturas nomeadas para a lógica do handlerNewRouter cria um roteador raiz que implementa http.Handler.Subrouter() escopa prefixos de caminho e herda os correspondentes do pai.StrictSlash controla o comportamento da barra final via r.StrictSlash(true).| Construtor | Propósito | Exemplo |
|---|---|---|
Path / PathPrefix | Modelo de caminho | /users/{id} |
Host | Subdomínio ou domínio | {tenant}.example.com |
Methods | Lista de permissão de verbos | GET, POST |
Headers | Valores de cabeçalho necessários | X-API-Key presente |
Queries | Regras de chave/valor de consulta | format=json |
Schemes | http vs https | Roteamento com terminação TLS |
Use a sintaxe {nome:padrão}.
{id:[0-9]+} rejeita IDs não numéricos antes que seu handler seja executado, retornando 404 para não correspondências.
Mantenha os regex legíveis - padrões complexos pertencem à documentação e aos testes.
// Middleware com mux: envolva o roteador ou handlers por rota
func logging(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
slog.Info("request", "path", r.URL.Path, "host", r.Host)
next.ServeHTTP(w, r)
})
}
srv := &http.Server{Addr: ":8080", Handler: logging(r)}mux não distribui um pacote de middleware rico como chi; componha wrappers no estilo stdlib ou use alice se você quiser helpers de encadeamento.
r.Host pode refletir nomes internos, a menos que Forwarded/X-Forwarded-Host seja normalizado. Correção: termine o TLS no gateway que define o host externo, ou o middleware reescreve r.Host deliberadamente.mux.Vars retorna nil se os nomes dos correspondentes diferirem das expectativas do handler. Correção: teste unitariamente cada modelo e centralize helpers de análise de vars.StrictSlash.| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| chi | Roteamento radix moderno, ecossistema de middleware ativo | Você precisa de correspondentes de host/regex que mux fornece de forma limpa |
stdlib ServeMux | Padrões {id} simples em Go 1.22+ | Regras de host/cabeçalho/consulta são complexas |
| Gin/Echo | Vinculação de framework e helpers JSON | Você deseja handlers stdlib e correspondentes explícitos |
| Gateway de API (nginx, Envoy) | Roteamento de host/caminho na borda | Você precisa apenas de roteamento em processo |
Está em modo de manutenção - seguro para aplicativos existentes, mas avalie chi ou roteamento de borda para novos serviços, a menos que os correspondentes do mux sejam necessários.
Ambos nomeiam segmentos; mux adiciona restrições regex inline e correspondentes adicionais para host, cabeçalhos e consultas no mesmo construtor de rota.
Sim - envolva o roteador ou handlers individuais usando wrappers padrão func(http.Handler) http.Handler.
Use httptest com caminhos totalmente qualificados e cabeçalhos Host definidos na solicitação para exercitar os correspondentes de host.
mux retorna 404; use r.NotFoundHandler para personalizar respostas e logs.
Sub-roteadores filhos combinam prefixos de caminho pai e podem adicionar suas próprias restrições de Host ou Headers.
Use mux para a forma estrutural do URL (IDs apenas de dígitos); mantenha a validação de negócios (existe no banco de dados) em handlers/serviços.
Não integrado - adicione middleware definindo cabeçalhos Access-Control-* antes de seus handlers.
Reescreva modelos de rota ({id:regex} para {id} ou validação de handler) e substitua mux.Vars por chi.URLParam; mantenha os handlers se já estiverem no formato stdlib.
Sim - correspondentes de host em rotas ou sub-roteadores despacham por r.Host em um listener compartilhado.
Configure o TLS do http.Server normalmente; use Schemes("https") ao terminar TLS no processo.
Gateways de borda se destacam em TLS e roteamento grosseiro; regras de host em processo ajudam quando você deseja um único binário e roteamento testável sem infraestrutura adicional.
Versões da Stack: Esta página foi escrita para Go 1.26.x (Padrão GC Green Tea, go fix modernizers - verifique o patch na compilação), chi (última versão - verifique na compilação), gin (última versão - verifique na compilação), echo (última versão - verifique na compilação), google.golang.org/grpc (última versão - verifique na compilação), sigs.k8s.io/controller-runtime (última versão - verifique na compilação), kubebuilder (última versão - verifique na compilação), tinygo (última versão - verifique os alvos de placa na compilação), wazero (última versão - verifique na compilação) e golangci-lint (última versão - verifique o conjunto de linters na compilação).
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026