0

0

记录Go语言采坑记录gob序列化坑

藏色散人

藏色散人

发布时间:2021-03-26 17:18:04

|

3115人浏览过

|

来源于csdn

转载

下面由golang教程栏目给大家分享go语言采坑记录gob序列化坑,希望对需要的朋友有所帮助!

package mainimport (
	"bytes"
	"encoding/gob"
	"fmt"
	"log"
	"os")func main() {
	/// 序列化编码&写入文件开始 ///
	// 实例化一个学生对象s1
	s1 := &Student{id: 1, name: "jack ma", age: 2, cash: 43242334.35}

	// 实例化一个gob编码对象,并对s1学生对象进行编码
	var buf bytes.Buffer
	encoder := gob.NewEncoder(&buf)
	error2Log("Encode: ", encoder.Encode(s1))

	// 输出序列化后的类容
	fmt.Printf("Serialized: %x\n", buf.Bytes())

	// 创建data.data文件,存放序列化数据
	fs, err := os.Create("./data.data")
	error2Log("Creat File: ", err)
	// 写入数据,并打印写入数据长度
	wlen, err := fs.Write(buf.Bytes())
	error2Log("Write file: ", err)
	fmt.Println("Wirte bytes:", wlen)
	fs.Close()

	/// 序列化编码&写入文件结束 ///

	/// 读入文件&反序列化编码开始 ///

	// 从文件打开写入的序列化数据
	fs, err = os.Open("./data.data")
	error2Log("Open file: ", err)
	// 获取文件信息接口
	finfo, err := fs.Stat()
	error2Log("Get fileinfo: ", err)
	// 根据文件大小创建字节数组,然后将文件中数据读入到字节数组中,并打印读入数据长度
	readBuf := make([]byte, finfo.Size())
	rlen, err := fs.Read(readBuf)
	error2Log("Read file: ", err)
	fmt.Println("Read bytes:", rlen)
	fs.Close()

	// 实例化一个用于接收反序列化数据的学生对象
	s2 := new(Student)

	// 实例化一个gob解码对象
	decoder := gob.NewDecoder(bytes.NewReader(readBuf))
	// 将数据解码到学生对象s2
	error2Log("Decode: ", decoder.Decode(s2))
	// 将反序列化后的数据,s2学生对象打印出来
	fmt.Println("Unserialized:", s2)

	/// 读入文件&反序列化编码结束 ///}func error2Log(m string, e error) {
	if e != nil {
		log.Fatal(m, e)
	}}// Student 学生对象type Student struct {
	id   uint64
	name string
	age  uint
	cash float64}

编译后运行结构如下:

2019/04/17 15:07:46 Encode: gob: type main.Student has no exported fields

害的我郁闷了一个多小时。查询了一些信息,比如:

https://github.com/golang/go/issues/5819
但是这不是我的需要的问题解决方法,我就想将一个结构体对象写到文件中去,也没打算嵌入结构体呀。
后来突然灵光一闪,我犯了个超级低级错误:

type Student struct {
	id   uint64
	name string
	age  uint
	cash float64}

尼玛… 结构体成员(golang叫字段)小写…,突然想起来关于包级的变量名和函数名,小写相当于private… 难道是这样?
马上改了:

立即学习go语言免费学习笔记(深入)”;

type Student struct {
	id   uint64
	name string
	age  uint
	cash float64}

14行那里的实例化s1改成:

s1 := &Student{ID: 1, Name: "jack ma", Age: 2, Cash: 43242334.35}

然后编译运行结构终于正确:

Serialized: 36ff810301010753747564656e7401ff820001040102494401060001044e616d65010c00010341676501060001044361736801080000001aff82010101076a61636b206d61010201f8cdccccf29a9e844100
Wirte bytes: 82
Read bytes: 82
Unserialized: &{1 jack ma 2 4.324233435e+07}

这相当于回过头来看,在golang中没有养成的代码习惯。
所以今后写结构体的时候,得养成好习惯:字段名应该使用首字母大写。(555555555555555~)

Postme
Postme

Postme是一款强大的AI写作工具,可以帮助您快速生成高质量、原创的外贸营销文案,助您征服全球市场。

下载
package mainimport (
	"bytes"
	"encoding/gob"
	"fmt"
	"log"
	"os")func main() {
	/// 序列化编码&写入文件开始 ///
	// 实例化一个学生对象s1
	s1 := &Student{id: 1, name: "jack ma", age: 2, cash: 43242334.35}

	// 实例化一个gob编码对象,并对s1学生对象进行编码
	var buf bytes.Buffer
	encoder := gob.NewEncoder(&buf)
	error2Log("Encode: ", encoder.Encode(s1))

	// 输出序列化后的类容
	fmt.Printf("Serialized: %x\n", buf.Bytes())

	// 创建data.data文件,存放序列化数据
	fs, err := os.Create("./data.data")
	error2Log("Creat File: ", err)
	// 写入数据,并打印写入数据长度
	wlen, err := fs.Write(buf.Bytes())
	error2Log("Write file: ", err)
	fmt.Println("Wirte bytes:", wlen)
	fs.Close()

	/// 序列化编码&写入文件结束 ///

	/// 读入文件&反序列化编码开始 ///

	// 从文件打开写入的序列化数据
	fs, err = os.Open("./data.data")
	error2Log("Open file: ", err)
	// 获取文件信息接口
	finfo, err := fs.Stat()
	error2Log("Get fileinfo: ", err)
	// 根据文件大小创建字节数组,然后将文件中数据读入到字节数组中,并打印读入数据长度
	readBuf := make([]byte, finfo.Size())
	rlen, err := fs.Read(readBuf)
	error2Log("Read file: ", err)
	fmt.Println("Read bytes:", rlen)
	fs.Close()

	// 实例化一个用于接收反序列化数据的学生对象
	s2 := new(Student)

	// 实例化一个gob解码对象
	decoder := gob.NewDecoder(bytes.NewReader(readBuf))
	// 将数据解码到学生对象s2
	error2Log("Decode: ", decoder.Decode(s2))
	// 将反序列化后的数据,s2学生对象打印出来
	fmt.Println("Unserialized:", s2)

	/// 读入文件&反序列化编码结束 ///}func error2Log(m string, e error) {
	if e != nil {
		log.Fatal(m, e)
	}}// Student 学生对象type Student struct {
	id   uint64
	name string
	age  uint
	cash float64}

编译后运行结构如下:

2019/04/17 15:07:46 Encode: gob: type main.Student has no exported fields

害的我郁闷了一个多小时。查询了一些信息,比如:
https://github.com/golang/go/issues/5819
但是这不是我的需要的问题解决方法,我就想将一个结构体对象写到文件中去,也没打算嵌入结构体呀。
后来突然灵光一闪,我犯了个超级低级错误:

type Student struct {
	id   uint64
	name string
	age  uint
	cash float64}

尼玛… 结构体成员(golang叫字段)小写…,突然想起来关于包级的变量名和函数名,小写相当于private… 难道是这样?
马上改了:

立即学习go语言免费学习笔记(深入)”;

type Student struct {
	id   uint64
	name string
	age  uint
	cash float64}

14行那里的实例化s1改成:

s1 := &Student{ID: 1, Name: "jack ma", Age: 2, Cash: 43242334.35}

然后编译运行结构终于正确:

Serialized: 36ff810301010753747564656e7401ff820001040102494401060001044e616d65010c00010341676501060001044361736801080000001aff82010101076a61636b206d61010201f8cdccccf29a9e844100
Wirte bytes: 82
Read bytes: 82
Unserialized: &{1 jack ma 2 4.324233435e+07}

这相当于回过头来看,在golang中没有养成的代码习惯。
所以今后写结构体的时候,得养成好习惯:字段名应该使用首字母大写。(555555555555555~)

相关专题

更多
C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

10

2026.01.23

php远程文件教程合集
php远程文件教程合集

本专题整合了php远程文件相关教程,阅读专题下面的文章了解更多详细内容。

29

2026.01.22

PHP后端开发相关内容汇总
PHP后端开发相关内容汇总

本专题整合了PHP后端开发相关内容,阅读专题下面的文章了解更多详细内容。

21

2026.01.22

php会话教程合集
php会话教程合集

本专题整合了php会话教程相关合集,阅读专题下面的文章了解更多详细内容。

21

2026.01.22

宝塔PHP8.4相关教程汇总
宝塔PHP8.4相关教程汇总

本专题整合了宝塔PHP8.4相关教程,阅读专题下面的文章了解更多详细内容。

13

2026.01.22

PHP特殊符号教程合集
PHP特殊符号教程合集

本专题整合了PHP特殊符号相关处理方法,阅读专题下面的文章了解更多详细内容。

11

2026.01.22

PHP探针相关教程合集
PHP探针相关教程合集

本专题整合了PHP探针相关教程,阅读专题下面的文章了解更多详细内容。

8

2026.01.22

菜鸟裹裹入口以及教程汇总
菜鸟裹裹入口以及教程汇总

本专题整合了菜鸟裹裹入口地址及教程分享,阅读专题下面的文章了解更多详细内容。

55

2026.01.22

Golang 性能分析与pprof调优实战
Golang 性能分析与pprof调优实战

本专题系统讲解 Golang 应用的性能分析与调优方法,重点覆盖 pprof 的使用方式,包括 CPU、内存、阻塞与 goroutine 分析,火焰图解读,常见性能瓶颈定位思路,以及在真实项目中进行针对性优化的实践技巧。通过案例讲解,帮助开发者掌握 用数据驱动的方式持续提升 Go 程序性能与稳定性。

9

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Rust 教程
Rust 教程

共28课时 | 4.7万人学习

Kotlin 教程
Kotlin 教程

共23课时 | 2.8万人学习

Go 教程
Go 教程

共32课时 | 4.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号