用 Gob 传输数据
概述
Gob 是 Go 自己的以二进制形式序列化和反序列化程序数据的格式;可以在 encoding 包中找到。这种格式的数据简称为 Gob (即 Go binary 的缩写)。类似于 Python 的 “pickle” 和 Java 的 “Serialization”。
Gob 通常用于远程方法调用(RPCs,参见 15.9 的 rpc 包)参数和结果的传输,以及应用程序和机器之间的数据传输。 它和 JSON 或 XML 有什么不同呢?Gob 特定地用于纯 Go 的环境中,例如,两个用 Go 写的服务之间的通信。这样的话服务可以被实现得更加高效和优化。 Gob 不是可外部定义,语言无关的编码方式。因此它的首选格式是二进制,而不是像 JSON 和 XML 那样的文本格式。 Gob 并不是一种不同于 Go 的语言,而是在编码和解码过程中用到了 Go 的反射。
Gob 文件或流是完全自描述的:里面包含的所有类型都有一个对应的描述,并且总是可以用 Go 解码,而不需要了解文件的内容。
只有可导出的字段会被编码,零值会被忽略。在解码结构体的时候,只有同时匹配名称和可兼容类型的字段才会被解码。当源数据类型增加新字段后,Gob 解码客户端仍然可以以这种方式正常工作:解码客户端会继续识别以前存在的字段。并且还提供了很大的灵活性,比如在发送者看来,整数被编码成没有固定长度的可变长度,而忽略具体的 Go 类型。
假如在发送者这边有一个有结构 T:
type T struct { X, Y, Z int }
var t = T{X: 7, Y: 0, Z: 8}
而在接收者这边可以用一个结构体 U 类型的变量 u 来接收这个值:
type U struct { X, Y *int8 }
var u U
在接收者中,X 的值是7,Y 的值是0(Y的值并没有从 t 中传递过来,因为它是零值)
和 JSON 的使用方式一样,Gob 使用通用的 io.Writer 接口,通过 NewEncoder() 函数创建 Encoder 对象并调用 Encode();相反的过程使用通用的 io.Reader 接口,通过 NewDecoder() 函数创建 Decoder 对象并调用 Decode。
我们把示例 12.12 的信息写进名为 vcard.gob 的文件作为例子。这会产生一个文本可读数据和二进制数据的混合,当你试着在文本编辑中打开的时候会看到。
字节缓冲模拟网络传输的简单例子:
// gob1.go
package mainimport ("bytes""fmt""encoding/gob""log"
)type P struct {X, Y, Z intName string
}type Q struct {X, Y *int32Name string
}func main() {// Initialize the encoder and decoder. Normally enc and dec would be // bound to network connections and the encoder and decoder would // run in different processes. var network bytes.Buffer // Stand-in for a network connection enc := gob.NewEncoder(&network) // Will write to network. dec := gob.NewDecoder(&network) // Will read from network. // Encode (send) the value. err := enc.Encode(P{3, 4, 5, "Pythagoras"})if err != nil {log.Fatal("encode error:", err)}// Decode (receive) the value. var q Qerr = dec.Decode(&q)if err != nil {log.Fatal("decode error:", err)}fmt.Printf("%q: {%d,%d}\n", q.Name, *q.X, *q.Y)
}
// Output: "Pythagoras": {3,4}
编码到文件:
// gob2.go
package mainimport ("encoding/gob""log""os"
)type Address struct {Type stringCity stringCountry string
}type VCard struct {FirstName stringLastName stringAddresses []*AddressRemark string
}var content stringfunc main() {pa := &Address{"private", "Aartselaar","Belgium"}wa := &Address{"work", "Boom", "Belgium"}vc := VCard{"Jan", "Kersschot", []*Address{pa,wa}, "none"}// fmt.Printf("%v: \n", vc) // {Jan Kersschot [0x126d2b80 0x126d2be0] none}:// using an encoder:file, _ := os.OpenFile("vcard.gob", os.O_CREATE|os.O_WRONLY, 0666)defer file.Close()enc := gob.NewEncoder(file)err := enc.Encode(vc)if err != nil {log.Println("Error in encoding gob")}
}
转载地址
https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/12.11.md
用 Gob 传输数据相关推荐
- 如何入门Go语言?这个开源项目赶紧收藏!
昨天小编给大家分享了一款基于Go语言的对象存储服务MinIO(自己搭建个对象存储服务难不难? 嗯嗯就那么一丢丢的意思 不过呢这也难怪,国内似乎还没有特别出色的适合初学者的Go语言教程书籍,而国外虽然有 ...
- 第11章 Go语言文件处理
本章我们将带领大家深入了解一下 Go语言中的文件处理,重点在于文件而非目录或者通用的文件系统,特别是如何读写标准格式(如 XML 和 JSON 格式)的文件以及自定义的纯文本和二进制格式文件. 由于前 ...
- Go语言append缺陷引发的深度拷贝讨论
看完苏炳添进入总决赛,看得我热血沸腾的,上厕所都不敢耽搁超过 5 分钟. 这历史性的一刻,让本决定休息的我,垂死病中惊坐起,开始肝文章. 引子 今天的文章从我周六加班改的一个bug引入,上下文是在某个 ...
- golang gob
前言 golang的gob是干嘛的?首先我们有一串数据,我们想让这些数据序列化,但是怎么序列化,序列化的格式是什么?我们都可以通过encoder去定义,比如我们想让一大坨数据(比如非常复杂的结构)序列 ...
- Java Socket传输数据的文件系统介绍
转自:http://developer.51cto.com/art/201003/189963.htm Java Socket传输数据在进行的时候有很多的事情需要我们不断的进行有关代码的学习.只有不断 ...
- 通过PHP前端后台交互/通过ajax前端后台交互/php基础传输数据应用/简单的留言版/简单的注册账户/简单的登录页/...
前 言 PHP 通过上一篇博客,注册账号与登录页面--前后台数据交互 跳转转到index主页,接下来进入主页留言板功能,通过ajax向后台传输数据,同时发表留言. 具体的内容分析如下 ...
- 解决ajax异步传输数据,return返回为undefined的问题
解决ajax异步传输数据,return返回为undefined的问题 参考文章: (1)解决ajax异步传输数据,return返回为undefined的问题 (2)https://www.cnblog ...
- Xamarin Essentials教程数据处理传输数据
Xamarin Essentials教程数据处理传输数据 在移动应用程序中,除了常规的数据处理,还涉及数据存储.数据传输.版本数据多个方面.Xamarin.Essentials组件提供了多个数据处理相 ...
- 怎么监控一个接口的传输数据_监控安装超详细教学教程,学会又多一门技能
大家好,这里是一涛说电脑,今天给大家讲讲关于监控的一些事.本篇属于长篇技术教学,有精通的朋友请绕路,有不懂或者不精通的朋友请耐心看完或多或少都有些许收获. 交通监控 治安监控 小区监控 说到监控,大家 ...
最新文章
- 举个栗子看如何做MySQL 内核深度优化
- java做条形图_使用Jfree实现吧条形图,java代码
- 在高并发情况nginx的作用
- 315曝光:老坛酸菜工人穿拖鞋、光脚踩 防腐剂超标10倍!多家电商平台下架老坛酸菜...
- Linux文件系统之inode与软硬连接
- 编程还是不要用百度翻译,这里有一款更符合编程的翻译工具
- html富强民主鼠标特效,给网站添加鼠标点击特效富强、民主、和谐 js效果 - 寒星皓月...
- leetcode 森林中的兔子
- 镁光闪存颗粒对照表_最全的内存颗粒编码规则说明,教你看穿内存条到底用的什么颗粒...
- 在linux下恶臭hellotext中作用的?,《Linux内核与程序设计》实验学习笔记
- (个体户)注册公众平台步骤
- 机器学习模型中的损失函数loss function
- 微服务API网关框架详解
- c语言setfocus作用,C语言FindWindow和SetFocus的问题?
- EtherCAT运动控制卡的自定义运动曲线
- 商品模块数据库表解析(一)
- install xmms
- unity中Avatar换装实现(三)之美
- linux进命令行模式vi,命令行中的 vi 模式
- 推荐一款基于chromium的套壳浏览器——vivaldi
热门文章
- 【电脑使用】送给即将迈入大学的电脑小白的一份电脑使用入场券
- 专利侵权的情形有哪些
- js 调用android定位,利用native.js获取手机gps是否开启
- w ndows更新,如何解决 Wndows 7 安装更新时遇到的 8024402f 错误及修复损坏的 Cryptographic Services 服务.pdf...
- 头像裁剪【微信小程序、uni-app】
- Lucene分词实现:Analyzer、TokenStream
- 现实还是幻想传说维罗纳
- 开发和实现一个疫情隔离区的订餐系统
- 三星官翻Note 7亮相:售价惊人!
- 音视频测试资源和工具tool