如何在Golang中使用encoding/gob序列化对象_存储和传输数据
技术百科
P粉602998670
发布时间:2026-01-02
浏览: 次 Go 的 encoding/gob 是专为 Go 类型设计的原生二进制序列化方案,高效安全、无需额外 schema,适用于进程间通信、缓存和持久化;要求结构体字段可导出、类型可编码,支持文件和网络传输,但不兼容其他语言且需注意版本兼容性与并发安全。
Go 的 encoding/gob
是 Go 原生二进制序列化方案,专为 Go 类型设计,高效、安全、无需额外 schema,适合进程间通信、缓存、持久化等场景。
gob 序列化的基本流程
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) - 建议在 encode/decode 前先注册自定义类型(尤其跨版本或含接口时):
gob.Register(User{})
通过网络传输 gob 数据
gob 天然适配 net.Conn,常用于 RPC 或微服务内部通信。发送端 encode,接收端 decode,双方需使用相同结构体定义。
立即学习“go语言免费学习笔记(深入)”;
- 服务端监听并解码:
conn, _ := listener.Accept(); dec := gob.NewDecoder(conn); dec.Decode(&req) - 客户端编码发送:
enc := gob.NewEncoder(conn); enc.Encode(req) - 注意:gob 不自带消息边界,TCP 流中需自行处理分帧(例如每次 encode 后 flush,或封装长度头)
- 若需多路请求响应,推荐搭配
net/rpc包,它底层就基于 gob
注意事项与常见陷阱
gob 不是通用格式,不能被其他语言直接解析;它的兼容性依赖 Go 版本和结构体定义稳定性。
- 结构体字段增删可能破坏兼容性:新增字段默认零值,删除字段会导致 decode 失败(除非用
gob.RegisterName或版本控制) - 时间类型
time.Time、空接口interface{}可编码,但需确保运行时类型已注册(如gob.Register(time.Time{})) - 避免对 map/slice 指针直接 encode;应 encode 值本身(
map[string]int可,*map[string]int易出错) - 并发使用同一 encoder/decoder 不安全;每个 goroutine 应独占实例
# 但不
# 适用于
# 自带
# 自定义
# 专为
# 数据结构
# 不支持
# go
# golang
# Error
# 并发
# 对象
# String
# int
# 编码
# 指针
# 接口
# 序列化
# register
# Interface
# var
# 封装
# 结构体
# Struct
# 切片
# map
# channel
# rpc
# 网络传输
# 最常见
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win11怎么连接投影仪_Win11多显示器投屏设
- 如何使用Golang log记录不同级别日志_Go
- 如何在Golang中处理模块冲突_解决依赖版本不兼
- Win11怎么禁用键盘自带键盘_Win11笔记本禁
- C++如何将C风格字符串(char*)转换为std
- 如何使用Golang模拟请求超时_Golang c
- MySQL 中使用 IF 和 CASE 实现查询字
- 如何在Mac上搭建Golang开发环境_使用Hom
- Windows电脑键盘突然失灵怎么办?(驱动与硬件
- Win11怎么关闭触摸屏_禁用Win11笔记本触摸
- Win11怎么设置多显示器任务栏 Win11扩展任
- 如何在Golang中使用time处理时间_Gola
- VSC怎么创建PHP项目_从零开始搭建项目的步骤【
- php打包exe怎么传递参数_命令行参数接收方法【
- c++怎么实现大文件的分块读写_c++ 文件指针s
- Win10电脑怎么设置IP地址_Windows10
- Golang如何避免指针逃逸_Golang逃逸分析
- 如何在 IIS 上为 ASP.NET 6 应用排除
- Windows怎样拦截QQ浏览器广告_Window
- Win11怎么关闭OneDrive同步_Win11
- Win11怎样安装网易云音乐_Win11安装网易云
- XML的“混合内容”是什么 怎么用DTD或XSD定
- Win11怎么关闭自动修复_跳过Win11开机自动
- Windows10如何更改系统字体大小_Win10
- Win11怎么开启自动HDR画质_Windows1
- Win10怎么卸载金山毒霸_Win10彻底卸载金山
- 如何提升Golang程序I/O性能_Golang
- Python大型项目拆分策略_模块化解析【教程】
- 如何在 Go 应用中实现自动错误恢复与进程重启机制
- php8.4匿名类怎么用_php8.4匿名类创建与
- Windows蓝屏错误0x00000018怎么处理
- Win11资源管理器卡顿怎么办 Win11文件资源
- Win11怎么关闭搜索历史_Win11清除设备上的
- Mac上的iMovie如何剪辑视频?(新手入门教程
- Win11怎么查看显卡温度 Win11任务管理器查
- Mac如何与安卓手机传文件_Mac和Android
- Windows驱动无法加载错误解决方法_驱动签名验
- Windows10系统怎么查看硬盘健康_Win10
- Python对象比较与排序_集合使用说明【指导】
- Win11怎么开启专注模式_Windows11时钟
- php后缀怎么变mp4能播放_让php伪装mp4正
- 如何在Golang中处理二进制数据_Golang
- Win11怎么关闭搜索历史 Win11清除搜索框最
- php下载安装包怎么选_threadsafe与nt
- Win11怎么恢复误删照片_Win11数据恢复工具
- Go 中实现 Python urllib.quot
- Python函数接口文档化_自动化说明【指导】
- 零基础学会Python自动化办公_高效处理Exce
- Win10如何卸载Skype_Win10卸载Sky
- Windows10怎么查看系统激活状态_Windo

QQ客服