log, regexp & text/template
O processamento de texto em produção Go abrange logs, correspondência de padrões e saída renderizada.
Busque em todas as páginas da documentação
O processamento de texto em produção Go abrange logs, correspondência de padrões e saída renderizada.
log/slog estrutura eventos para pipelines de observabilidade.
regexp extrai e valida texto com desempenho previsível.
text/template e html/template geram e-mails, CLIs e HTML sem bugs de concatenação de strings.
Migre novos serviços para slog com manipuladores JSON e filtros de nível.
Mantenha o pacote log apenas onde o custo de migração exceder o benefício.
Pré-compile expressões regulares na inicialização do pacote ou na inicialização, não por solicitação.
Escolha html/template sempre que a saída for para navegadores para obter a auto-escapagem contextual.
Cartão de receita de referência rápida - pronto para copiar e colar.
import (
"log/slog"
"os"
"regexp"
"text/template"
)
slog.SetDefault(slog.New(slog.NewJSONHandler(os.Stdout, nil)))
var reUUID = regexp.MustCompile(`[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}`)
tmpl := template.Must(template.New("mail").Parse("Hello {{.Name}}\n"))Quando usar isso:
html/template.package main
import (
"bytes"
"errors"
"html/template"
"log/slog"
"os"
"regexp"
"text/template"
)
type User struct {
Name string
Email string
}
var emailRe = regexp.MustCompile(`^[^@\s]+@[^@\s]+\.[^@\s]+$`)
func validateAndRender(u User) (string, error) {
if !emailRe.MatchString(u.Email) {
return "", ErrInvalidEmail
}
slog.Info("render welcome",
slog.String("user", u.Name),
slog.String("email", u.Email),
)
textT := template.Must(template.New("text").Parse("Welcome {{.Name}} <{{.Email}}>"))
var textBuf bytes.Buffer
if err := textT.Execute(&textBuf, u); err != nil {
return "", err
}
htmlT := template.Must(template.New("html").Parse(`<p>Welcome <b>{{.Name}}</b></p>`))
var htmlBuf bytes.Buffer
if err := htmlT.Execute(&htmlBuf, u); err != nil {
return "", err
}
return htmlBuf.String(), nil
}
var ErrInvalidEmail = errors.New("invalid email")
func main() {
slog.SetDefault(slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelInfo})))
out, err := validateAndRender(User{Name: "Ada", Email: "ada@example.com"})
if err != nil {
panic(err)
}
println(out)
}O que isso demonstra:
slog.Info com atributos tipados.text/template e html/template a partir de uma única struct.template.Must para falha no tempo de análise na inicialização quando movido para init.slog roteia registros através de um Handler (JSONHandler, TextHandler ou customizado) com controle de nível.regexp compila padrões para autômatos com sintaxe RE2 (sem retrovisores).{{.Field}} e ações como range e if.html/template aplica regras de escape contextual por contexto HTML, JS, URL e CSS.| API | Saída | Melhor para |
|---|---|---|
log | Linhas de stderr não estruturadas | Scripts, depuração rápida |
log/slog | Registros nivelados e atribuídos | Serviços e bibliotecas |
| Zap/zerolog de terceiros | Desempenho específico do ecossistema | Pilhas existentes já padronizadas |
// Anexa ID da solicitação entre manipuladores:
logger := slog.With(slog.String("request_id", id))
logger.Info("handled", slog.Int("status", 200))
// Subcorrespondências de Regex:
parts := re.FindStringSubmatch(line)
// Mapa de funções de template:
tmpl.Funcs(template.FuncMap{"upper": strings.ToUpper})regexp.MustCompile na inicialização ou use sync.Once.<script>. Correção: html/template para saída do navegador.slog.SetDefault em main cedo; aceitar *slog.Logger em pacotes.encoding/json, tokenizador html ou analisadores adequados.Execute entra em pânico em campos ausentes. Correção: usar {{if .Optional}} ou verificações de ponteiro em structs de dados.| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| zap / zerolog | Logging de nanossegundos em QPS altíssimo | slog Greenfield é suficiente |
Funções strings | Verificações simples de prefixo/divisão | Necessidades de padrão com uso intensivo de regex |
embed + arquivos estáticos | Ativos HTML fixos | Conteúdo de e-mail personalizado |
fmt.Fprintf one-liners | Saída apenas para depuração | Logs estruturados de produção |
Use log/slog para novos serviços.
Mantenha log em código legado até uma passagem de migração focada; ambos podem coexistir durante a transição.
slog.HandlerOptions{Level: slog.LevelDebug} no seu manipulador.
Controle logs de depuração em produção com variáveis de ambiente ou tags de compilação.
Não.
O regexp do Go segue RE2, que omite retrovisores e lookahead para garantias de tempo linear.
Reestruture padrões ou use um mecanismo diferente se você realmente precisar desses recursos.
Regex compilado em literais simples é mais pesado do que Contains ou HasPrefix.
Use funções de string para verificações de substring fixas; regex quando a estrutura importa.
Analise um template base com blocos {{define "layout"}} e {{template "layout" .}} em filhos.
ParseFiles e ParseGlob carregam conjuntos na inicialização.
Envolva os.File em um slog.Handler ou use io.MultiWriter com bibliotecas de rotação estilo lumberjack.
A escolha do manipulador permanece independente do destino.
O escape contextual depende do tipo de atributo.
Use auxiliares tipados como template.URL para valores href dinâmicos.
Execute em bytes.Buffer em testes de tabela e compare strings douradas.
Para HTML, afirme substrings em vez de arquivos completos sensíveis a espaços em branco.
As flags do pacote log (LstdFlags, Lshortfile) aplicam-se apenas à saída legada de log.
slog usa atributos explícitos em vez disso.
Passe a flag (?m) para comportamento ^ e $ multilinha.
Ou habilite a constante regexp.Multiline ao compilar com Compile.
Saída parcial pode já ter sido escrita no escritor.
Use buffers para respostas atômicas ou descarte em caso de erro antes de enviar cabeçalhos HTTP.
Substitua strings de formato por pares de chave-valor de atributo: slog.Info("msg", "key", value).
Envolva sites de chamada legados incrementalmente atrás de uma pequena interface de logging.
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 (mais recente - verifique na compilação), gin (mais recente - verifique na compilação), echo (mais recente - verifique na compilação), google.golang.org/grpc (mais recente - verifique na compilação), sigs.k8s.io/controller-runtime (mais recente - verifique na compilação), kubebuilder (mais recente - verifique na compilação), tinygo (mais recente - verifique os alvos de placa na compilação), wazero (mais recente - verifique na compilação) e golangci-lint (mais recente - verifique o conjunto de linters na compilação).
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026