本文主要是介绍encoding/gob,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
import "encoding/gob"
gob包管理gob流——在编码器(发送器)和解码器(接受器)之间交换的binary值。一般用于传递远端程序调用(RPC)的参数和结果,如net/rpc包就有提供。
本实现给每一个数据类型都编译生成一个编解码程序,当单个编码器用于传递数据流时,会分期偿还编译的消耗,是效率最高的。
基本特点
1.gob流是自解码的
2.流中的所有数据都有前缀(采用一个预定义类型的集合)指明其类型.
3.指针不会传递,而是传递值
4.递归的类型可以很好的工作,但是递归的值(比如说值内某个成员直接/间接指向该值)会出问题。
go编解码过程
1.先要创建一个编码器
2.并向其一共一系列数据:可以是值,也可以是指向实际存在数据的指针。
3.编码器会确保所有必要的类型信息都被发送。
4.在接收端,解码器从编码数据流中恢复数据并将它们填写进本地变量里
下面写一个小实例演示一下过程
package mainimport ("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)
}
我们创建了一个编码器,将数据写入流中,然后创建了一个解码器,将数据流解码到user变量中
我们下面自定义编码的编解码过程
package mainimport ("bytes""encoding/gob""log""fmt"
)type User struct {Name string
}// 编码过程
func (v User) MarshalBinary() ([]byte, error) {var b bytes.Bufferfmt.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)
}
让对象实现方法 UnmarshalBinary(data []byte) error
和 MarshalBinary() ([]byte, error)
即可实现重写编码过程
这篇关于encoding/gob的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!