gob全称为:Go binary

Golang自带的一个数据结构序列化编码/解码工具,也就是说gob可以讲go中的一个数据结构序列化成某种东西,还能反序列化!序列化成啥我们后面来看,不管是变成一个字符串,变成二进制流,变成啥先不管,反正作用就是序列化。

正文

Gob使用时我们需要关注Encoder和Decoder对象,顾名思义,一个是编码的时候用的,一个是解码的时候用的,我们看一下怎么获取这两个对象先:

  所以很明确,需要调用这两个函数来获取Encoder和Decoder对象。注意这里的参数是io.Writer和io.Reader接口类型,我们在上一讲介绍过这两个接口,所以这里需要的参数分别是实现了io.Writer和io.Reader接口类型的对象即可。

  Encoder和Decoder分别有一个主要的方法是:

  看到这里我们已经可以得到如下结论:

  Gob 使用 io.Writer 接口,通过 NewEncoder() 函数创建 Encoder 对象通过调用 Encode()方法实现编码操作;使用 io.Reader 接口,通过 NewDecoder() 函数创建 Decoder 对象并调用 Decode()方法完成解码操作!

  接下来我们试着用一下这个Encoder和Decoder,就轻轻松松入门gob了,来看第一个例子

  例1:数据结构与bytes.Buffer之间的转换(编码成字节切片)

 package main
 
 import (
     "bytes"
     "fmt"
     "encoding/gob"
     "io"
 )
 
//准备编码的数据
type P struct {
    X, Y, Z int
    Name    string
}

//接收解码结果的结构
type Q struct {
    X, Y *int32
    Name string
}

func main() {
    //初始化一个数据
    data := P{3, 4, 5, "CloudGeek"}
    //编码后得到buf字节切片
    buf := encode(data)
    //用于接收解码数据
    var q *Q
    //解码操作
    q = decode(buf)
    //"CloudGeek": {3,4}
    fmt.Printf("%q: {%d,%d}\n", q.Name, *q.X, *q.Y)

}

func encode(data interface{}) *bytes.Buffer {
    //Buffer类型实现了io.Writer接口
    var buf bytes.Buffer
    //得到编码器
    enc := gob.NewEncoder(&buf)
    //调用编码器的Encode方法来编码数据data
    enc.Encode(data)
    //编码后的结果放在buf中
    return &buf
}

func decode(data interface{}) *Q {
    d := data.(io.Reader)
    //获取一个解码器,参数需要实现io.Reader接口
    dec := gob.NewDecoder(d)
    var q Q
    //调用解码器的Decode方法将数据解码,用Q类型的q来接收
    dec.Decode(&q)
    return &q
}

  例2:数据结构到文件的序列化和反序列化

  上面2个例子都不难,我去掉了错误处理之类的代码,尽量注释了每块代码,耐心看完这2个例子应该就能体会gob的encode和decode精髓了。

理解gob是什么的基础上,如果你需要使用gob开发,建议详细看一下官方文档,了解一下更多的细节:https://golang.org/pkg/encoding/gob/

本文出至:学新通