首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

encoding/gob

import "encoding/gob"

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

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

基本特点

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

go编解码过程

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

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

代码语言:javascript
复制
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)
}

image.png

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

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

代码语言:javascript
复制
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)
}

image.png

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

下一篇
举报
领券