encoding/xml, gob e Formatos Binários
JSON cobre a maioria das APIs HTTP, mas Go também inclui encoding/xml e encoding/gob para feeds legados e caches binários nativos do Go.
Busque em todas as páginas da documentação
JSON cobre a maioria das APIs HTTP, mas Go também inclui encoding/xml e encoding/gob para feeds legados e caches binários nativos do Go.
Protobuf e outros codecs binários ficam ao lado da stdlib quando contratos cruzam linguagens ou precisam de tamanhos de rede compactos.
Escolha o serializador para corresponder ao consumidor: navegadores e REST público permanecem em JSON; integrações XML corporativas usam encoding/xml; limites de processos exclusivamente Go podem usar gob; serviços gRPC usam protobuf.
Cada formato tem regras de compatibilidade, considerações de segurança e ergonomia de depuração diferentes.
Cartão de receita de referência rápida - pronto para copiar e colar.
// Marshal XML
type Feed struct {
XMLName xml.Name `xml:"feed"`
Title string `xml:"title"`
Items []Item `xml:"item"`
}
b, err := xml.Marshal(Feed{Title: "News"})
// registro + codificação gob (apenas Go-para-Go)
gob.Register(User{})
var buf bytes.Buffer
enc := gob.NewEncoder(&buf)
_ = enc.Encode(User{ID: 1})Quando usar isso:
package main
import (
"bytes"
"encoding/gob"
"encoding/xml"
"fmt"
)
type Item struct {
ID int `xml:"id" json:"id"`
Label string `xml:"label" json:"label"`
}
type Catalog struct {
XMLName xml.Name `xml:"catalog"`
Items []Item `xml:"item"`
}
type CacheEntry struct {
Key string
Items []Item
}
func main() {
cat := Catalog{Items: []Item{{ID: 1, Label: "bolt"}}}
xmlBytes, _ := xml.MarshalIndent(cat, "", " ")
fmt.Println(string(xmlBytes))
gob.Register(CacheEntry{})
var buf bytes.Buffer
enc := gob.NewEncoder(&buf)
_ = enc.Encode(CacheEntry{Key: "parts", Items: cat.Items})
dec := gob.NewDecoder(&buf)
var restored CacheEntry
_ = dec.Decode(&restored)
fmt.Println(restored.Items[0].Label)
}O que isso demonstra:
xml.Name em XMLName define o elemento raiz.gob.Register é necessário para valores de interface e tipos concretos não exportados em alguns casos.Tags XML espelham tags JSON: xml:"field", xml:"-", xml:",attr" para atributos, xml:",chardata" para nós de texto.
xml.Unmarshal é rigoroso ao corresponder elementos de início; namespaces podem exigir atributos xmlns em structs.
Use XML quando:
Evite XML para novas APIs móveis ou de navegador públicas, a menos que seja necessário.
gob codifica informações de tipo Go na rede.
Tanto o codificador quanto o decodificador devem concordar com os tipos registrados quando interfaces estão envolvidas.
gob não é adequado para:
gob se encaixa:
net/rpc (legado; prefira gRPC para novo trabalho).| Formato | Pacote / ferramenta | Linguagem Cruzada | Esquema |
|---|---|---|---|
| Protobuf | google.golang.org/protobuf | Sim | Arquivos .proto |
| MessagePack | terceiros | Sim | Informal |
| CBOR | terceiros | Sim | Informal |
| gob | encoding/gob | Apenas Go | Tipos Go |
google.golang.org/grpc usa protobuf sobre HTTP/2; veja Noções Básicas de gRPC para o fluxo de trabalho de geração de código.
// Prefira DTOs separados quando as formas XML e JSON divergirem
type UserXML struct { /* tags xml */ }
type UserJSON struct { /* tags json */ }Misturar muitas famílias de tags em uma mega-struct complica as revisões; divida quando as formas de rede diferirem materialmente.
gob.Register para tipos concretos na inicialização.XMLName ausente ou tags xmlns quebram o unmarshal. Correção: espelhe exatamente a amostra XML do parceiro nos testes.| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| JSON | Depuração humana, APIs HTTP | RPC interno ultra-compacto |
| Protobuf/gRPC | Contratos entre serviços tipados | Scripts rápidos |
| gob | Cache Go no mesmo repositório | Qualquer consumidor não-Go |
| XML | Formato de parceiro mandatório | Clientes móveis Greenfield |
| CSV | Exportações tabulares | Estruturas aninhadas |
Sim, quando as formas se alinham.
Divida DTOs quando os layouts de atributo vs elemento divergem.
Frequentemente sim para caminhos Go-para-Go, pois evita a análise de texto.
Meça em seus tamanhos de carga antes de se comprometer.
Use xml.NewDecoder e xml.NewEncoder para documentos grandes.
Mesmo padrão dos decodificadores JSON.
Prefira protobuf ou JSON com esquemas para qualquer coisa persistida ou inspecionada por operadores.
gob é melhor para caches efêmeros locais de processo.
Protobuf tem números de campo versionados e geradores entre linguagens.
gob é mais simples, mas específico para Go e acoplado a tipos.
Verifique na compilação para sua placa; reflexão XML pode ser mais pesada que JSON.
Verifique os destinos do rodapé da pilha.
Drivers lidam com BSON; você geralmente trabalha com structs Go e tags na camada de aplicação.
Veja a documentação do driver de banco de dados para convenções de tags.
Não para novos sistemas.
Use gRPC com protobuf para RPC tipado.
Você não pode lê-las em um editor de texto.
Registre valores de struct antes da codificação ou use JSON em endpoints apenas de desenvolvimento.
Sim - defina Content-Type para application/json, application/xml ou tipos binários do gRPC.
Os clientes dependem de cabeçalhos para a escolha da decodificação.
Versões da Pilha: Esta página foi escrita para Go 1.26.x (GC padrão 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 da 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: 18 de jul. de 2026