go之Gob

gob包(“encoding/gob”)管理gob流——在encoder(编码器,也就是发送器)和decoder(解码器,也就是接受器)之间交换的字节流数据(gob 就是 go binary的缩写)。一般用于传递远端程序调用(RPC)的参数和结果。

要使用gob,通过调用NewEncoder()方法先创建一个编码器,并向其提供一系列数据;然后在接收端,通过调用NewDecoder()方法创建一个解码器,它从数据流中恢复数据并将它们填写进本地变量里。下面会通过几个例子进行说明。

发送端和接收端的值/类型不需要严格匹配。对结构体来说,某一字段(通过字段名进行识别)如果发送端有而接收端没有,会被忽略;接收端有而发送端没有的字段也会被忽略;发送端和接收端都有的字段其类型必须是可兼容的;发送端和接收端都会在gob流和实际go类型之间进行必要的指针取址/寻址工作

package main

import (
	"bytes"
	"encoding/gob"
	"errors"
	"fmt"
	"reflect"
)

type Person struct {
	Name string
	Age  int
}

type Person1 struct {
	Name string
	Age  int
}

type Person2 struct {
	Name string
	Age1 int
}

func main() {
	p := Person{Name: "justin", Age: 30}
	buf := Encoder(p)
	p1 := &Person1{}
	err := Decoder(buf, p1)
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Println(p1.Name, p1.Age)
	}

	p2 := Person2{}
	err = Decoder(buf, p2)
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Println(p2.Name, p2.Age1)
	}
}

func Encoder(inter interface{}) bytes.Buffer {
	var buf bytes.Buffer
	// writer
	encoder := gob.NewEncoder(&buf)
	err := encoder.Encode(inter)
	if err != nil {
		fmt.Println(err)
	}
	return buf
}

func Decoder(buf bytes.Buffer, inter interface{}) error {
	rt := reflect.TypeOf(inter)
	if rt.Kind() != reflect.Ptr {
		return errors.New("inter must be ptr")
	}
	// reader
	decoder := gob.NewDecoder(&buf)
	decoder.Decode(inter)
	return nil
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值