Go语言标准库学习之encoding/gob——Go语言Gob流的管理

本文深入探讨Go语言中的Gob包,讲解其在二进制数据流编码和解码中的应用,包括主要函数的使用、编码优势及局限性,并通过实例演示如何使用Gob进行数据传输。

gob包是用来管理gob流的,它可以实现在编码器(发送器)和解码器(接收器)之间进行二进制数据流的发送,一般用来传递远端程序调用的参数和结果,比如net/rpc包就有用到这个。下面我们来学习以下gob标准库的使用,希望对你有帮助。

一、主要函数介绍

gob和json的pack之类的方法一样,由发送端使用Encoder对数据结构进行编码。在接收端收到消息之后,接收端使用Decoder将序列化的数据变化成本地变量。与json编码格式相比,gob编码可以实现json所不支持的struct的方法序列化,利用gob包序列化struct保存到本地也十分方便。

1. 记录数据的类型和名称
  • Register

    // Register记录value下层具体值的类型和其名称。
    // 该名称将用来识别发送或接受接口类型值时下层的具体类型。
    // 本函数只应在初始化时调用,如果类型和名字的映射不是一一对应的,会panic。
    func Register(value interface{
         
         })
    
  • RegisterName

    // RegisterName类似Register,区别是这里使用提供的name代替类型的默认名称。
    func RegisterName(name string, value interface{
         
         })
    
2. 编码

数据在传输时会先经过编码后再进行传输,与编码相关的有三种方法:

  • NewDecoder

    // NewEncoder返回一个将编码后数据写入w的*Encoder。
    func NewEncoder(w io.Writer) *Encoder
    
  • Encode

    // Encode方法将e编码后发送,并且会保证所有的类型信息都先发送。
    func (enc *Encoder) Encode(e interface{
         
         }) error
    
  • EncodeValue

    // EncodeValue方法将value代表的数据编码后发送,并且会保证所有的类型信息都先发送。
    func (enc *Encoder) EncodeValue(value reflect.Value) error
    
3. 解码

接收到数据后需要对数据进行解码,与解码相关的有三种方法:

  • NewDecoder

    // 函数返回一个从r读取数据的*Decoder,如果r不满足io.ByteReader接口,则会包装r为bufio.Reader。
    func NewDecoder(r io.Reader) *Decoder
    
  • Decode

    // Decode从输入流读取下一个之并将该值存入e。
    // 如果e是nil,将丢弃该值,否则e必须是可接收该值的类型的指针。
    // 如果输入结束,方法会返回io.EOF并且不修改e(指向的值)。
    func (dec *Decoder) Decode(e interface{
         
         }) error
    
  • DecodeValue

    // DecodeValue从输入流读取下一个值,如果v是reflect.Value类型的零值(v.Kind() == Invalid),方法丢弃该值;否则它会把该值存入v。
    // 此时,v必须代表一个非nil的指向实际存在值的指针或者可写入的reflect.Value(v.CanSet()为真)。
    // 如果输入结束,方法会返回io.EOF并且不修改e(指向的值)。
    func (dec *Decoder) DecodeValue(v reflect.Value) error
    

二、gob编码的优势和局限性

1. 局限性

这里需要明确一点,gob只能用在golang中,所以在实际工程开发过程中,如果与其他端,或者其他语言打交道,那么gob是不可以的,我们就要使用json了。

2. 优势

Gob流是自解码的。流中的所有数据都有前缀(采用一个预定义类型的集合)指明其类型。指针不会传递,而是传递值;也就是说数据是压平了的。递归的类型可以很好的工作,但是递归的值(比如说值内某个成员直接/间接指向该值)会出问题。这个问题将来可能会修复。

要使用gob,先要创建一个编码器,并向其一共一系列数据:可以是值,也可以是指向实际存在数据的指针。编码器会确保所有必要的类型信息都被发送。在接收端,解码器从编码数据流中恢复数据并将它们填写进本地变量里。

gob编解码并没有要求发送方和接收方的结构完全一致,下面是官方文档的翻译:

// 定义一个结构体
	struct {
   
    A, B int }

// 下面类型的数据都是可以发送和接收的:

	struct {
   
    A, B int }	// the same
	*struct {
   
    A, B int }	// extra indirection of the struct
	struct {
   <
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值