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

在 Go 语言中,encoding/gob 是一种高效的二进制序列化方式,专为 Go 设计,适用于结构体在程序间传递或持久化存储。与 JSON 不同,gob 更快、更紧凑,但仅限于 Go 程序之间使用。
gob 序列化的基本用法
要使用 gob 进行序列化,需导入 encoding/gob 包,并确保被序列化的类型是可导出的(字段首字母大写)。
示例:将结构体序列化为字节流
package mainimport ( "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: %vn", 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: %+vn", 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.Buffergob.NewEncoder(&buf).Encode(users)var loadedUsers []Usergob.NewDecoder(&buf).Decode(&loadedUsers)
基本上就这些。gob 使用简单,性能好,适合内部服务通信或缓存场景,但不要用于对外 API。注意类型一致性,避免运行时错误。
以上就是Golang encoding/gob序列化与反序列化实践的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1408591.html
微信扫一扫
支付宝扫一扫