encoding/xml, gob y Formatos Binarios
JSON cubre la mayoría de las API HTTP, pero Go también incluye encoding/xml y encoding/gob para feeds heredados y cachés binarios nativos de Go.
Busca en todas las páginas de la documentación
JSON cubre la mayoría de las API HTTP, pero Go también incluye encoding/xml y encoding/gob para feeds heredados y cachés binarios nativos de Go.
Protobuf y otros códecs binarios se sitúan junto a la biblioteca estándar cuando los contratos cruzan lenguajes o necesitan tamaños de cable compactos.
Elija el serializador para que coincida con el consumidor: los navegadores y las REST públicas se quedan con JSON; las integraciones empresariales XML utilizan encoding/xml; los límites de procesos solo de Go pueden usar gob; los servicios gRPC usan protobuf.
Cada formato tiene diferentes reglas de compatibilidad, consideraciones de seguridad y ergonomía de depuración.
Tarjeta de receta de referencia rápida, lista para copiar y pegar.
// XML marshal
type Feed struct {
XMLName xml.Name `xml:"feed"`
Title string `xml:"title"`
Items []Item `xml:"item"`
}
b, err := xml.Marshal(Feed{Title: "News"})
// registro gob + codificación (solo Go a Go)
gob.Register(User{})
var buf bytes.Buffer
enc := gob.NewEncoder(&buf)
_ = enc.Encode(User{ID: 1})Cuándo recurrir a esto:
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)
}Lo que esto demuestra:
xml.Name en XMLName establece el elemento raíz.gob.Register es necesario para valores de interfaz y tipos concretos no exportados en algunos casos.Las etiquetas XML reflejan las etiquetas JSON: xml:"field", xml:"-", xml:",attr" para atributos, xml:",chardata" para nodos de texto.
xml.Unmarshal es estricto al hacer coincidir los elementos de inicio; los espacios de nombres pueden requerir atributos xmlns en las estructuras.
Use XML cuando:
Evite XML para nuevas API móviles o de navegador públicas a menos que sea necesario.
gob codifica la información de tipo de Go en el cable.
Tanto el codificador como el decodificador deben estar de acuerdo con los tipos registrados cuando hay interfaces involucradas.
gob no es adecuado para:
gob encaja:
net/rpc (heredado; prefiera gRPC para nuevo trabajo).| Formato | Paquete / herramienta | Multi-idioma | Esquema |
|---|---|---|---|
| Protobuf | google.golang.org/protobuf | Sí | Archivos .proto |
| MessagePack | terceros | Sí | Informal |
| CBOR | terceros | Sí | Informal |
| gob | encoding/gob | Solo Go | Tipos de Go |
google.golang.org/grpc usa protobuf sobre HTTP/2; consulte Fundamentos de gRPC para el flujo de trabajo de generación de código.
// Prefiera DTOs separados cuando las formas XML y JSON diverjan
type UserXML struct { /* etiquetas xml */ }
type UserJSON struct { /* etiquetas json */ }Mezclar muchas familias de etiquetas en una mega-estructura complica las revisiones; divida cuando las formas del cable difieran materialmente.
gob.Register para tipos concretos al inicio.XMLName o etiquetas xmlns rompe la desserialización. Solución: refleje la muestra XML del socio exactamente en las pruebas.| Alternativa | Úselo cuando | No lo use cuando |
|---|---|---|
| JSON | Depuración humana, API HTTP | RPC interno ultra-compacto |
| Protobuf/gRPC | Contratos de servicio cruzado tipados | Scripts rápidos |
| gob | Caché Go en el mismo repositorio | Cualquier consumidor no Go |
| XML | Formato de socio exigido | Clientes móviles nuevos |
| CSV | Exportaciones tabulares | Estructuras anidadas |
Sí, cuando las formas se alinean.
Divida los DTO cuando los diseños de atributos frente a elementos diverjan.
A menudo sí para rutas de Go a Go porque evita el análisis de texto.
Mida en sus tamaños de carga útil antes de comprometerse.
Use xml.NewDecoder y xml.NewEncoder para documentos grandes.
Mismo patrón que los decodificadores JSON.
Prefiera protobuf o JSON con esquemas para cualquier cosa persistida o inspeccionada por operadores.
gob es mejor para cachés efímeros locales de procesos.
Protobuf tiene números de campo versionados y generadores multiplataforma.
gob es más simple pero específico de Go y acoplado a tipos.
Verifique en la compilación para su placa; la reflexión XML puede ser más pesada que JSON.
Compruebe los destinos del pie de página de la pila.
Los controladores manejan BSON; normalmente trabaja con estructuras Go y etiquetas en la capa de aplicación.
Consulte la documentación del controlador de base de datos para conocer las convenciones de etiquetas.
No para sistemas nuevos.
Use gRPC con protobuf para RPC tipado.
No puede leerlas en un editor de texto.
Registre los valores de la estructura antes de codificar o use JSON en puntos finales solo de desarrollo.
Sí, establezca Content-Type en application/json, application/xml o los tipos binarios de gRPC.
Los clientes dependen de las cabeceras para la elección de decodificación.
Versiones de la pila: Esta página fue escrita para Go 1.26.x (predeterminado de GC Green Tea, go fix modernizers - verifique el parche en la compilación), chi (última versión - verifique en la compilación), gin (última versión - verifique en la compilación), echo (última versión - verifique en la compilación), google.golang.org/grpc (última versión - verifique en la compilación), sigs.k8s.io/controller-runtime (última versión - verifique en la compilación), kubebuilder (última versión - verifique en la compilación), tinygo (última versión - verifique los objetivos de la placa en la compilación), wazero (última versión - verifique en la compilación) y golangci-lint (última versión - verifique el conjunto de linters en la compilación).
Revisado por Chris St. John·Última actualización: 18 jul 2026