golang Gob怎么使用

2023-02-08 22:48:13 12 0
魁首哥

golang Gob怎么使用

本篇内容介绍了“golang Gob怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

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

  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之间的转换(编码成字节切片)

 1package main 2 3import ( 4    "bytes" 5    "fmt" 6    "encoding/gob" 7    "io" 8) 910//准备编码的数据11type P struct {12    X, Y, Z int13    Name    string14}1516//接收解码结果的结构17type Q struct {18    X, Y *int3219    Name string20}2122func main() {23    //初始化一个数据24    data := P{3, 4, 5, "CloudGeek"}25    //编码后得到buf字节切片26    buf := encode(data)27    //用于接收解码数据28    var q *Q29    //解码操作30    q = decode(buf)31    //"CloudGeek": {3,4}32    fmt.Printf("%q: {%d,%d}\n", q.Name, *q.X, *q.Y)3334}3536func encode(data interface{}) *bytes.Buffer {37    //Buffer类型实现了io.Writer接口38    var buf bytes.Buffer39    //得到编码器40    enc := gob.NewEncoder(&buf)41    //调用编码器的Encode方法来编码数据data42    enc.Encode(data)43    //编码后的结果放在buf中44    return &buf45}4647func decode(data interface{}) *Q {48    d := data.(io.Reader)49    //获取一个解码器,参数需要实现io.Reader接口50    dec := gob.NewDecoder(d)51    var q Q52    //调用解码器的Decode方法将数据解码,用Q类型的q来接收53    dec.Decode(&q)54    return &q55}

  例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精髓了。

“golang Gob怎么使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注恰卡编程网网站,小编将为大家输出更多高质量的实用文章!

收藏
分享
海报
0 条评论
12
上一篇:go语言中协程与线程的区别有哪些 下一篇:php时区不正确如何解决

本站已关闭游客评论,请登录或者注册后再评论吧~

忘记密码?

图形验证码