• 技术文章 >后端开发 >Golang

    golang Gob是什么

    青灯夜游青灯夜游2023-02-02 17:42:38原创512

    gob是Golang包自带的一个数据结构序列化的编码/解码工具,编码使用Encoder,解码使用Decoder。Gob使用io.Writer 接口,通过NewEncoder()函数创建Encoder对象通过调用Encode()方法实现编码操作;使用io.Reader接口,通过NewDecoder()函数创建Decoder对象并调用Decode()方法完成解码操作。

    本教程操作环境:windows7系统、GO 1.18版本、Dell G3电脑。

      gob全称为:Go binary

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

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

    1.png

    2.png

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

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

    3.png

    4.png

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

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

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

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

     1package main
     2
     3import (
     4    "bytes"
     5    "fmt"
     6    "encoding/gob"
     7    "io"
     8)
     9
    10//准备编码的数据
    11type P struct {
    12    X, Y, Z int
    13    Name    string
    14}
    15
    16//接收解码结果的结构
    17type Q struct {
    18    X, Y *int32
    19    Name string
    20}
    21
    22func main() {
    23    //初始化一个数据
    24    data := P{3, 4, 5, "CloudGeek"}
    25    //编码后得到buf字节切片
    26    buf := encode(data)
    27    //用于接收解码数据
    28    var q *Q
    29    //解码操作
    30    q = decode(buf)
    31    //"CloudGeek": {3,4}
    32    fmt.Printf("%q: {%d,%d}\n", q.Name, *q.X, *q.Y)
    33
    34}
    35
    36func encode(data interface{}) *bytes.Buffer {
    37    //Buffer类型实现了io.Writer接口
    38    var buf bytes.Buffer
    39    //得到编码器
    40    enc := gob.NewEncoder(&buf)
    41    //调用编码器的Encode方法来编码数据data
    42    enc.Encode(data)
    43    //编码后的结果放在buf中
    44    return &buf
    45}
    46
    47func decode(data interface{}) *Q {
    48    d := data.(io.Reader)
    49    //获取一个解码器,参数需要实现io.Reader接口
    50    dec := gob.NewDecoder(d)
    51    var q Q
    52    //调用解码器的Decode方法将数据解码,用Q类型的q来接收
    53    dec.Decode(&q)
    54    return &q
    55}

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

     1package main
     2
     3import (
     4    "encoding/gob"
     5    "os"
     6    "fmt"
     7)
     8
     9//试验用的数据类型
    10type Address struct {
    11    City    string
    12    Country string
    13}
    14
    15//序列化后数据存放的路径
    16var filePath string
    17
    18func main() {
    19    filePath = "./address.gob"
    20    encode()
    21    pa := decode()
    22    fmt.Println(*pa) //{Chengdu China}
    23}
    24
    25//将数据序列号后写到文件中
    26func encode() {
    27    pa := &Address{"Chengdu", "China"}
    28    //打开文件,不存在的时候新建
    29    file, _ := os.OpenFile(filePath, os.O_CREATE|os.O_WRONLY, 0666)
    30    defer file.Close()
    31
    32    //encode后写到这个文件中
    33    enc := gob.NewEncoder(file)
    34    enc.Encode(pa)
    35}
    36
    37//从文件中读取数据并反序列化
    38func decode() *Address {
    39    file, _ := os.Open(filePath)
    40    defer file.Close()
    41
    42    var pa Address
    43    //decode操作
    44    dec := gob.NewDecoder(file)
    45    dec.Decode(&pa)
    46    return &pa
    47}

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

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

    【相关推荐:Go视频教程编程教学

    以上就是golang Gob是什么的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:Gob Golang go语言
    上一篇:go语言有什么好处 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • Go语言中GOROOT、GOPATH、GOBIN详解• 记录Go语言采坑记录gob序列化坑• go语言中标识符的含义是什么• go语言空白标识符是什么• go语言预定义标识符有多少个
    1/1

    PHP中文网