encoding/gob

import "encoding/gob"

gob包管理gob流——在编码器(发送器)和解码器(接受器)之间交换的binary值。一般用于传递远端程序调用(RPC)的参数和结果,如net/rpc包就有提供。

本实现给每一个数据类型都编译生成一个编解码程序,当单个编码器用于传递数据流时,会分期偿还编译的消耗,是效率最高的。

基本特点

1.gob流是自解码的
2.流中的所有数据都有前缀(采用一个预定义类型的集合)指明其类型.
3.指针不会传递,而是传递值
4.递归的类型可以很好的工作,但是递归的值(比如说值内某个成员直接/间接指向该值)会出问题。

go编解码过程

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

下面写一个小实例演示一下过程

package main

import (
    "bytes"
    "encoding/gob"
    "log"
    "fmt"
)

type User struct {
    Name string
}

func main() {
   var network bytes.Buffer
   // 1.创建编码器
   enc := gob.NewEncoder(&network)
   // 2.向编码器中写入数据
    err := enc.Encode(User{Name:"酷走天涯"})
    if err != nil {
       log.Fatal(err)
    }
    
   // 3.创建解码器
   dec := gob.NewDecoder(&network)
   var user User
   // 4.解码
   dec.Decode(&user)
   fmt.Println(user.Name)
}
1594482-7694ef80d4bfada2.png
image.png

我们创建了一个编码器,将数据写入流中,然后创建了一个解码器,将数据流解码到user变量中

我们下面自定义编码的编解码过程

package main

import (
    "bytes"
    "encoding/gob"
    "log"
    "fmt"
)

type User struct {
    Name string
}

// 编码过程
func (v User) MarshalBinary() ([]byte, error) {
    var b bytes.Buffer
    fmt.Fprintln(&b, v.Name)
    return b.Bytes(), nil
}
// 自定义解码过程
func (v *User) UnmarshalBinary(data []byte) error {
    // A simple encoding: plain text.
    b := bytes.NewBuffer(data)
    _, err := fmt.Fscanln(b, &v.Name)
    return err
}

func main() {
   var network bytes.Buffer
   // 1.创建编码器
   enc := gob.NewEncoder(&network)
   // 2.向编码器中写入数据
    err := enc.Encode(User{Name:"酷走天涯"})
    if err != nil {
       log.Fatal(err)
    }

   // 3.创建解码器
   dec := gob.NewDecoder(&network)
   var user User
   // 4.解码
   dec.Decode(&user)
   fmt.Println(user)
}
1594482-315df2a7c9c37fc1.png
image.png

让对象实现方法 UnmarshalBinary(data []byte) errorMarshalBinary() ([]byte, error)即可实现重写编码过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值