gob是Go专用的高效二进制序列化工具,用于结构体在程序间传递或存储。使用时需导入encoding/gob,结构体字段必须可导出(首字母大写),通过gob.NewEncoder编码到字节流,再用gob.NewDecoder解码还原。支持slice、map等复合类型,但仅限Go间通信,不跨语言,且需注意类型顺序一致和自定义类型注册。

在 Go 语言中,encoding/gob 是一种高效的二进制序列化方式,专为 Go 设计,适用于结构体在程序间传递或持久化存储。与 JSON 不同,gob 更快、更紧凑,但仅限于 Go 程序之间使用。
gob 序列化的基本用法
要使用 gob 进行序列化,需导入 encoding/gob 包,并确保被序列化的类型是可导出的(字段首字母大写)。
示例:将结构体序列化为字节流
package main
import (
"bytes"
"encoding/gob"
"fmt"
)
type User struct {
ID int
Name string
Age uint8
}
func main() {
user := User{ID: 1, Name: "Alice", Age: 25}
var buf bytes.Buffer
encoder := gob.NewEncoder(&buf)
err := encoder.Encode(user)
if err != nil {
panic(err)
}
data := buf.Bytes()
fmt.Printf("Serialized data: %v\n", data)
}
gob 反序列化的实现
反序列化过程需要预先定义目标变量,并使用 gob.NewDecoder 读取字节流还原原始数据。
立即学习“go语言免费学习笔记(深入)”;
继续上面的例子:
var decodedUser User
decoder := gob.NewDecoder(bytes.NewReader(data))
err = decoder.Decode(&decodedUser)
if err != nil {
panic(err)
}
fmt.Printf("Deserialized user: %+v\n", decodedUser)
输出结果会显示原始结构体重现成功。
注意事项与限制
- 只能用于 Go 程序之间通信,不支持跨语言
- 结构体字段必须是可导出的(大写字母开头),否则不会被编码
- 必须先注册自定义类型(如果涉及接口或指针多态),使用 gob.Register()
- 编码和解码的类型顺序需一致,尤其在多次 Encode/Decode 时
- nil 指针不会报错,但对应字段不会被编码
处理复杂类型与切片
gob 支持 slice、map、指针等复合类型,只要元素类型是 gob 可处理的。
例如序列化一个用户列表:
users := []User{
{ID: 1, Name: "Alice", Age: 25},
{ID: 2, Name: "Bob", Age: 30},
}
var buf bytes.Buffer
gob.NewEncoder(&buf).Encode(users)
var loadedUsers []User
gob.NewDecoder(&buf).Decode(&loadedUsers)
基本上就这些。gob 使用简单,性能好,适合内部服务通信或缓存场景,但不要用于对外 API。注意类型一致性,避免运行时错误。










