Go 的 encoding/gob 是专为 Go 类型设计的原生二进制序列化方案,高效安全、无需额外 schema,适用于进程间通信、缓存和持久化;要求结构体字段可导出、类型可编码,支持文件和网络传输,但不兼容其他语言且需注意版本兼容性与并发安全。
Go 的 encoding/gob 是 Go 原生二进制序列化方案,专为 Go 类型设计,高效、安全、无需额外 schema,适合进程间通信、缓存、持久化等场景。
gob 要求数据结构是可导出的(首字母大写),且字段类型需支持 gob 编码(如基本类型、切片、map、结构体、指针等)。不支持函数、channel、未导出字段、含不可编码字段的嵌套结构。
type User struct { Name string; Age int }
gob.NewEncoder(w io.Writer),w 可以是文件、网络连接或 bytes.Buffer
Encode(v interface{}) error 写入数据gob.NewDecoder(r io.Reader),再调用 Decode(&v),注意传入变量地址使用 os.Create 和 os.Open 配合 gob 编解码,是最常见的持久化方式。注意错误检查和资源关闭。
f, _ := os.Create("data.gob"); defer f.Close(); enc := gob.NewEncoder(f); enc.Encode(user)
f, _ := os.Open("data.gob"); defer f.Close(); dec := gob.NewDecoder(f); var u User; dec.Decode(&u)
gob.Register(User{})
gob 天然适配 net.Conn,常用于 RPC 或微服务内部通信。发送端 encode,接收端 decode,双方需使用相同结构体定义。
立即学习“go语言免费学习笔记(深入)”;
conn, _ := listener.Accept(); dec := gob.NewDecoder(conn); dec.Decode(&req)
enc := gob.NewEncoder(conn); enc.Encode(req)
net/rpc 包,它底层就基于 gobgob 不是通用格式,不能被其他语言直接解析;它的兼容性依赖 Go 版本和结构体定义稳定性。
gob.RegisterName 或版本控制)time.Time、空接口 interface{} 可编码,但需确保运行时类型已注册(如 gob.Register(time.Time{}))map[string]int 可,*map[string]int 易出错)