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
}