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

在 Go 语言中,encoding/gob 是一种高效的二进制序列化方式,专为 Go 设计,适用于结构体在程序间传递或持久化存储。与 JSON 不同,gob 更快、更紧凑,但仅限于 Go 程序之间使用。
要使用 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.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)
输出结果会显示原始结构体重现成功。
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。注意类型一致性,避免运行时错误。
以上就是Golang encoding/gob序列化与反序列化实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号